Commit 887ac0a0 authored by Jean Tourrilhes's avatar Jean Tourrilhes Committed by Linus Torvalds

[PATCH] : IrNET module fix

	o [CORRECT] Fix module refcounting (MOD_INC/DEC => .owner)
	o [FEATURE] Add hints to discovery (control channel)
parent a2c48d59
...@@ -225,6 +225,10 @@ ...@@ -225,6 +225,10 @@
* *
* v13 - 30.5.02 - Jean II * v13 - 30.5.02 - Jean II
* o Update module init code * o Update module init code
*
* v14 - 20.2.03 - Jean II
* o Add discovery hint bits in the control channel.
* o Remove obsolete MOD_INC/DEC_USE_COUNT in favor of .owner
*/ */
/***************************** INCLUDES *****************************/ /***************************** INCLUDES *****************************/
...@@ -476,6 +480,7 @@ typedef struct irnet_log ...@@ -476,6 +480,7 @@ typedef struct irnet_log
__u32 saddr; __u32 saddr;
__u32 daddr; __u32 daddr;
char name[NICKNAME_MAX_LEN + 1]; /* 21 + 1 */ char name[NICKNAME_MAX_LEN + 1]; /* 21 + 1 */
__u16_host_order hints; /* Discovery hint bits */
} irnet_log; } irnet_log;
/* /*
......
...@@ -28,7 +28,8 @@ irnet_post_event(irnet_socket * ap, ...@@ -28,7 +28,8 @@ irnet_post_event(irnet_socket * ap,
irnet_event event, irnet_event event,
__u32 saddr, __u32 saddr,
__u32 daddr, __u32 daddr,
char * name) char * name,
__u16 hints)
{ {
unsigned long flags; /* For spinlock */ unsigned long flags; /* For spinlock */
int index; /* In the log */ int index; /* In the log */
...@@ -52,6 +53,8 @@ irnet_post_event(irnet_socket * ap, ...@@ -52,6 +53,8 @@ irnet_post_event(irnet_socket * ap,
strcpy(irnet_events.log[index].name, name); strcpy(irnet_events.log[index].name, name);
else else
irnet_events.log[index].name[0] = '\0'; irnet_events.log[index].name[0] = '\0';
/* Copy hints */
irnet_events.log[index].hints.word = hints;
/* Try to get ppp unit number */ /* Try to get ppp unit number */
if((ap != (irnet_socket *) NULL) && (ap->ppp_open)) if((ap != (irnet_socket *) NULL) && (ap->ppp_open))
irnet_events.log[index].unit = ppp_unit_number(&ap->chan); irnet_events.log[index].unit = ppp_unit_number(&ap->chan);
...@@ -609,7 +612,7 @@ irda_irnet_destroy(irnet_socket * self) ...@@ -609,7 +612,7 @@ irda_irnet_destroy(irnet_socket * self)
* doesn't exist anymore when we post the event, so we need to pass * doesn't exist anymore when we post the event, so we need to pass
* NULL as the first arg... */ * NULL as the first arg... */
irnet_post_event(NULL, IRNET_DISCONNECT_TO, irnet_post_event(NULL, IRNET_DISCONNECT_TO,
self->saddr, self->daddr, self->rname); self->saddr, self->daddr, self->rname, 0);
} }
/* Prevent various IrDA callbacks from messing up things /* Prevent various IrDA callbacks from messing up things
...@@ -862,7 +865,7 @@ irnet_connect_socket(irnet_socket * server, ...@@ -862,7 +865,7 @@ irnet_connect_socket(irnet_socket * server,
/* Notify the control channel */ /* Notify the control channel */
irnet_post_event(new, IRNET_CONNECT_FROM, irnet_post_event(new, IRNET_CONNECT_FROM,
new->saddr, new->daddr, server->rname); new->saddr, new->daddr, server->rname, 0);
DEXIT(IRDA_SERV_TRACE, "\n"); DEXIT(IRDA_SERV_TRACE, "\n");
return 0; return 0;
...@@ -893,7 +896,7 @@ irnet_disconnect_server(irnet_socket * self, ...@@ -893,7 +896,7 @@ irnet_disconnect_server(irnet_socket * self,
/* Notify the control channel (see irnet_find_socket()) */ /* Notify the control channel (see irnet_find_socket()) */
irnet_post_event(NULL, IRNET_REQUEST_FROM, irnet_post_event(NULL, IRNET_REQUEST_FROM,
self->saddr, self->daddr, self->rname); self->saddr, self->daddr, self->rname, 0);
/* Clean up the server to keep it in listen state */ /* Clean up the server to keep it in listen state */
irttp_listen(self->tsap); irttp_listen(self->tsap);
...@@ -1108,12 +1111,12 @@ irnet_disconnect_indication(void * instance, ...@@ -1108,12 +1111,12 @@ irnet_disconnect_indication(void * instance,
/* If we were active, notify the control channel */ /* If we were active, notify the control channel */
if(test_open) if(test_open)
irnet_post_event(self, IRNET_DISCONNECT_FROM, irnet_post_event(self, IRNET_DISCONNECT_FROM,
self->saddr, self->daddr, self->rname); self->saddr, self->daddr, self->rname, 0);
else else
/* If we were trying to connect, notify the control channel */ /* If we were trying to connect, notify the control channel */
if((self->tsap) && (self != &irnet_server.s)) if((self->tsap) && (self != &irnet_server.s))
irnet_post_event(self, IRNET_NOANSWER_FROM, irnet_post_event(self, IRNET_NOANSWER_FROM,
self->saddr, self->daddr, self->rname); self->saddr, self->daddr, self->rname, 0);
/* Close our IrTTP connection, cleanup tsap */ /* Close our IrTTP connection, cleanup tsap */
if((self->tsap) && (self != &irnet_server.s)) if((self->tsap) && (self != &irnet_server.s))
...@@ -1213,7 +1216,7 @@ irnet_connect_confirm(void * instance, ...@@ -1213,7 +1216,7 @@ irnet_connect_confirm(void * instance,
/* Notify the control channel */ /* Notify the control channel */
irnet_post_event(self, IRNET_CONNECT_TO, irnet_post_event(self, IRNET_CONNECT_TO,
self->saddr, self->daddr, self->rname); self->saddr, self->daddr, self->rname, 0);
DEXIT(IRDA_TCB_TRACE, "\n"); DEXIT(IRDA_TCB_TRACE, "\n");
} }
...@@ -1282,7 +1285,7 @@ irnet_status_indication(void * instance, ...@@ -1282,7 +1285,7 @@ irnet_status_indication(void * instance,
{ {
case STATUS_NO_ACTIVITY: case STATUS_NO_ACTIVITY:
irnet_post_event(self, IRNET_BLOCKED_LINK, irnet_post_event(self, IRNET_BLOCKED_LINK,
self->saddr, self->daddr, self->rname); self->saddr, self->daddr, self->rname, 0);
break; break;
default: default:
DEBUG(IRDA_CB_INFO, "Unknown status...\n"); DEBUG(IRDA_CB_INFO, "Unknown status...\n");
...@@ -1648,7 +1651,8 @@ irnet_discovery_indication(discinfo_t * discovery, ...@@ -1648,7 +1651,8 @@ irnet_discovery_indication(discinfo_t * discovery,
/* Notify the control channel */ /* Notify the control channel */
irnet_post_event(NULL, IRNET_DISCOVER, irnet_post_event(NULL, IRNET_DISCOVER,
discovery->saddr, discovery->daddr, discovery->info); discovery->saddr, discovery->daddr, discovery->info,
u16ho(discovery->hints));
DEXIT(IRDA_OCB_TRACE, "\n"); DEXIT(IRDA_OCB_TRACE, "\n");
} }
...@@ -1678,7 +1682,8 @@ irnet_expiry_indication(discinfo_t * expiry, ...@@ -1678,7 +1682,8 @@ irnet_expiry_indication(discinfo_t * expiry,
/* Notify the control channel */ /* Notify the control channel */
irnet_post_event(NULL, IRNET_EXPIRE, irnet_post_event(NULL, IRNET_EXPIRE,
expiry->saddr, expiry->daddr, expiry->info); expiry->saddr, expiry->daddr, expiry->info,
u16ho(expiry->hints));
DEXIT(IRDA_OCB_TRACE, "\n"); DEXIT(IRDA_OCB_TRACE, "\n");
} }
......
...@@ -69,7 +69,8 @@ static void ...@@ -69,7 +69,8 @@ static void
irnet_event, irnet_event,
__u32, __u32,
__u32, __u32,
char *); char *,
__u16);
/* ----------------------- IRDA SUBROUTINES ----------------------- */ /* ----------------------- IRDA SUBROUTINES ----------------------- */
static inline int static inline int
irnet_open_tsap(irnet_socket *); irnet_open_tsap(irnet_socket *);
......
...@@ -213,10 +213,12 @@ irnet_read_discovery_log(irnet_socket * ap, ...@@ -213,10 +213,12 @@ irnet_read_discovery_log(irnet_socket * ap,
if(ap->disco_index < ap->disco_number) if(ap->disco_index < ap->disco_number)
{ {
/* Write an event */ /* Write an event */
sprintf(event, "Found %08x (%s) behind %08x\n", sprintf(event, "Found %08x (%s) behind %08x {hints %02X-%02X}\n",
ap->discoveries[ap->disco_index].daddr, ap->discoveries[ap->disco_index].daddr,
ap->discoveries[ap->disco_index].info, ap->discoveries[ap->disco_index].info,
ap->discoveries[ap->disco_index].saddr); ap->discoveries[ap->disco_index].saddr,
ap->discoveries[ap->disco_index].hints[0],
ap->discoveries[ap->disco_index].hints[1]);
DEBUG(CTRL_INFO, "Writing discovery %d : %s\n", DEBUG(CTRL_INFO, "Writing discovery %d : %s\n",
ap->disco_index, ap->discoveries[ap->disco_index].info); ap->disco_index, ap->discoveries[ap->disco_index].info);
...@@ -313,16 +315,20 @@ irnet_ctrl_read(irnet_socket * ap, ...@@ -313,16 +315,20 @@ irnet_ctrl_read(irnet_socket * ap,
switch(irnet_events.log[ap->event_index].event) switch(irnet_events.log[ap->event_index].event)
{ {
case IRNET_DISCOVER: case IRNET_DISCOVER:
sprintf(event, "Discovered %08x (%s) behind %08x\n", sprintf(event, "Discovered %08x (%s) behind %08x {hints %02X-%02X}\n",
irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].daddr,
irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].name,
irnet_events.log[ap->event_index].saddr); irnet_events.log[ap->event_index].saddr,
irnet_events.log[ap->event_index].hints.byte[0],
irnet_events.log[ap->event_index].hints.byte[1]);
break; break;
case IRNET_EXPIRE: case IRNET_EXPIRE:
sprintf(event, "Expired %08x (%s) behind %08x\n", sprintf(event, "Expired %08x (%s) behind %08x {hints %02X-%02X}\n",
irnet_events.log[ap->event_index].daddr, irnet_events.log[ap->event_index].daddr,
irnet_events.log[ap->event_index].name, irnet_events.log[ap->event_index].name,
irnet_events.log[ap->event_index].saddr); irnet_events.log[ap->event_index].saddr,
irnet_events.log[ap->event_index].hints.byte[0],
irnet_events.log[ap->event_index].hints.byte[1]);
break; break;
case IRNET_CONNECT_TO: case IRNET_CONNECT_TO:
sprintf(event, "Connected to %08x (%s) on ppp%d\n", sprintf(event, "Connected to %08x (%s) on ppp%d\n",
...@@ -445,8 +451,6 @@ dev_irnet_open(struct inode * inode, ...@@ -445,8 +451,6 @@ dev_irnet_open(struct inode * inode,
ap = kmalloc(sizeof(*ap), GFP_KERNEL); ap = kmalloc(sizeof(*ap), GFP_KERNEL);
DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n"); DABORT(ap == NULL, -ENOMEM, FS_ERROR, "Can't allocate struct irnet...\n");
MOD_INC_USE_COUNT;
/* initialize the irnet structure */ /* initialize the irnet structure */
memset(ap, 0, sizeof(*ap)); memset(ap, 0, sizeof(*ap));
ap->file = file; ap->file = file;
...@@ -469,7 +473,6 @@ dev_irnet_open(struct inode * inode, ...@@ -469,7 +473,6 @@ dev_irnet_open(struct inode * inode,
{ {
DERROR(FS_ERROR, "Can't setup IrDA link...\n"); DERROR(FS_ERROR, "Can't setup IrDA link...\n");
kfree(ap); kfree(ap);
MOD_DEC_USE_COUNT;
return err; return err;
} }
...@@ -514,7 +517,6 @@ dev_irnet_close(struct inode * inode, ...@@ -514,7 +517,6 @@ dev_irnet_close(struct inode * inode,
} }
kfree(ap); kfree(ap);
MOD_DEC_USE_COUNT;
DEXIT(FS_TRACE, "\n"); DEXIT(FS_TRACE, "\n");
return 0; return 0;
......
...@@ -98,6 +98,7 @@ static int ...@@ -98,6 +98,7 @@ static int
/* Filesystem callbacks (to call us) */ /* Filesystem callbacks (to call us) */
static struct file_operations irnet_device_fops = static struct file_operations irnet_device_fops =
{ {
.owner = THIS_MODULE,
.read = dev_irnet_read, .read = dev_irnet_read,
.write = dev_irnet_write, .write = dev_irnet_write,
.poll = dev_irnet_poll, .poll = dev_irnet_poll,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment