Commit 760a916d authored by Linus Torvalds's avatar Linus Torvalds

Merge http://gkernel.bkbits.net/irda-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents e752b6dd 5a1c8ba5
......@@ -10,6 +10,8 @@
* Modified by: Dag Brattli <dag@brattli.net>
* Modified at: Tue Jun 26 2001
* Modified by: Stefani Seibold <stefani@seibold.net>
* Modified at: Thur Apr 18 2002
* Modified by: Jeff Snyder <je4d@pobox.com>
*
* Copyright (c) 2001 Stefani Seibold
* Copyright (c) 1999-2001 Dag Brattli
......@@ -539,7 +541,7 @@ static int __init ircc_open(unsigned int fir_base, unsigned int sir_base)
if (ircc_irq < 255) {
if (ircc_irq!=irq)
MESSAGE("%s, Overriding IRQ - chip says %d, using %d\n",
driver_name, self->io->irq, ircc_irq);
driver_name, irq, ircc_irq);
self->io->irq = ircc_irq;
}
else
......@@ -547,13 +549,13 @@ static int __init ircc_open(unsigned int fir_base, unsigned int sir_base)
if (ircc_dma < 255) {
if (ircc_dma!=dma)
MESSAGE("%s, Overriding DMA - chip says %d, using %d\n",
driver_name, self->io->dma, ircc_dma);
driver_name, dma, ircc_dma);
self->io->dma = ircc_dma;
}
else
self->io->dma = dma;
request_region(fir_base, CHIP_IO_EXTENT, driver_name);
request_region(self->io->fir_base, CHIP_IO_EXTENT, driver_name);
/* Initialize QoS for this device */
irda_init_max_qos_capabilies(&irport->qos);
......@@ -1191,10 +1193,9 @@ static int __exit ircc_close(struct ircc_cb *self)
outb(IRCC_CFGB_IR, iobase+IRCC_SCE_CFGB);
#endif
/* Release the PORT that this driver is using */
IRDA_DEBUG(0, __FUNCTION__ "(), releasing 0x%03x\n",
self->io->fir_base);
IRDA_DEBUG(0, __FUNCTION__ "(), releasing 0x%03x\n", iobase);
release_region(self->io->fir_base, self->io->fir_ext);
release_region(iobase, CHIP_IO_EXTENT);
if (self->tx_buff.head)
kfree(self->tx_buff.head);
......
......@@ -100,7 +100,7 @@ struct lsap_cb {
irda_queue_t queue; /* Must be first */
magic_t magic;
int connected;
unsigned long connected; /* set_bit used on this */
int persistent;
__u8 slsap_sel; /* Source (this) LSAP address */
......@@ -119,6 +119,21 @@ struct lsap_cb {
struct lap_cb *lap; /* Pointer to LAP connection structure */
};
/*
* Used for caching the last slsap->dlsap->handle mapping
*
* We don't need to keep/match the remote address in the cache because
* we are associated with a specific LAP (which implies it).
* Jean II
*/
typedef struct {
int valid;
__u8 slsap_sel;
__u8 dlsap_sel;
struct lsap_cb *lsap;
} CACHE_ENTRY;
/*
* Information about each registred IrLAP layer
*/
......@@ -140,19 +155,15 @@ struct lap_cb {
struct qos_info *qos; /* LAP QoS for this session */
struct timer_list idle_timer;
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
/* The lsap cache was moved from struct irlmp_cb to here because
* it must be associated with the specific LAP. Also, this
* improves performance. - Jean II */
CACHE_ENTRY cache; /* Caching last slsap->dlsap->handle mapping */
#endif
};
/*
* Used for caching the last slsap->dlsap->handle mapping
*/
typedef struct {
int valid;
__u8 slsap_sel;
__u8 dlsap_sel;
struct lsap_cb *lsap;
} CACHE_ENTRY;
/*
* Main structure for IrLMP
*/
......@@ -166,9 +177,6 @@ struct irlmp_cb {
int free_lsap_sel;
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
CACHE_ENTRY cache; /* Caching last slsap->dlsap->handle mapping */
#endif
struct timer_list discovery_timer;
hashbin_t *links; /* IrLAP connection table */
......
......@@ -139,7 +139,7 @@ struct tsap_cb {
__u32 tx_max_sdu_size; /* Max transmit user data size */
int close_pend; /* Close, but disconnect_pend */
int disconnect_pend; /* Disconnect, but still data to send */
unsigned long disconnect_pend; /* Disconnect, but still data to send */
struct sk_buff *disconnect_skb;
};
......
......@@ -93,9 +93,6 @@ int __init irlmp_init(void)
irlmp->cachelog = hashbin_new(HB_GLOBAL);
irlmp->free_lsap_sel = 0x10; /* Reserved 0x00-0x0f */
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
irlmp->cache.valid = FALSE;
#endif
strcpy(sysctl_devname, "Linux");
/* Do discovery every 3 seconds */
......@@ -208,10 +205,6 @@ static void __irlmp_close_lsap(struct lsap_cb *self)
if (self->conn_skb)
dev_kfree_skb(self->conn_skb);
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
ASSERT(irlmp != NULL, return;);
irlmp->cache.valid = FALSE;
#endif
kfree(self);
}
......@@ -247,6 +240,9 @@ void irlmp_close_lsap(struct lsap_cb *self)
}
/* Now, remove from the link */
lsap = hashbin_remove(lap->lsaps, (int) self, NULL);
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
lap->cache.valid = FALSE;
#endif
}
self->lap = NULL;
/* Check if we found the LSAP! If not then try the unconnected lsaps */
......@@ -292,6 +288,9 @@ void irlmp_register_link(struct irlap_cb *irlap, __u32 saddr, notify_t *notify)
lap->saddr = saddr;
lap->daddr = DEV_ADDR_ANY;
lap->lsaps = hashbin_new(HB_GLOBAL);
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
lap->cache.valid = FALSE;
#endif
lap->lap_state = LAP_STANDBY;
......@@ -602,7 +601,7 @@ struct lsap_cb *irlmp_dup(struct lsap_cb *orig, void *instance)
/* Make sure that we invalidate the cache */
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
irlmp->cache.valid = FALSE;
new->lap->cache.valid = FALSE;
#endif /* CONFIG_IRDA_CACHE_LAST_LSAP */
return new;
......@@ -692,17 +691,16 @@ void irlmp_disconnect_indication(struct lsap_cb *self, LM_REASON reason,
return;
}
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
irlmp->cache.valid = FALSE;
#endif
/*
* Remove association between this LSAP and the link it used
*/
ASSERT(self->lap != NULL, return;);
ASSERT(self->lap->lsaps != NULL, return;);
lsap = hashbin_remove(self->lap->lsaps, (int) self, NULL);
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
self->lap->cache.valid = FALSE;
#endif
ASSERT(lsap != NULL, return;);
ASSERT(lsap == self, return;);
......
......@@ -408,13 +408,14 @@ void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log)
}
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
inline void irlmp_update_cache(struct lsap_cb *self)
static inline void irlmp_update_cache(struct lap_cb *lap,
struct lsap_cb *lsap)
{
/* Update cache entry */
irlmp->cache.dlsap_sel = self->dlsap_sel;
irlmp->cache.slsap_sel = self->slsap_sel;
irlmp->cache.lsap = self;
irlmp->cache.valid = TRUE;
lap->cache.dlsap_sel = lsap->dlsap_sel;
lap->cache.slsap_sel = lsap->slsap_sel;
lap->cache.lsap = lsap;
lap->cache.valid = TRUE;
}
#endif
......@@ -423,6 +424,17 @@ inline void irlmp_update_cache(struct lsap_cb *self)
*
* Find handle assosiated with destination and source LSAP
*
* Any IrDA connection (LSAP/TSAP) is uniquely identified by
* 3 parameters, the local lsap, the remote lsap and the remote address.
* We may initiate multiple connections to the same remote service
* (they will have different local lsap), a remote device may initiate
* multiple connections to the same local service (they will have
* different remote lsap), or multiple devices may connect to the same
* service and may use the same remote lsap (and they will have
* different remote address).
* So, where is the remote address ? Each LAP connection is made with
* a single remote device, so imply a specific remote address.
* Jean II
*/
static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
__u8 slsap_sel, int status,
......@@ -436,11 +448,11 @@ static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
* cache first to avoid the linear search
*/
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
if ((irlmp->cache.valid) &&
(irlmp->cache.slsap_sel == slsap_sel) &&
(irlmp->cache.dlsap_sel == dlsap_sel))
if ((self->cache.valid) &&
(self->cache.slsap_sel == slsap_sel) &&
(self->cache.dlsap_sel == dlsap_sel))
{
return (irlmp->cache.lsap);
return (self->cache.lsap);
}
#endif
lsap = (struct lsap_cb *) hashbin_get_first(queue);
......@@ -458,7 +470,7 @@ static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
lsap->dlsap_sel = dlsap_sel;
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
irlmp_update_cache(lsap);
irlmp_update_cache(self, lsap);
#endif
return lsap;
}
......@@ -469,7 +481,7 @@ static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
(lsap->dlsap_sel == dlsap_sel))
{
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
irlmp_update_cache(lsap);
irlmp_update_cache(self, lsap);
#endif
return lsap;
}
......
......@@ -409,8 +409,8 @@ typedef struct irnet_socket
/* ------------------------ IrTTP part ------------------------ */
/* We create a pseudo "socket" over the IrDA tranport */
int ttp_open; /* Set when IrTTP is ready */
int ttp_connect; /* Set when IrTTP is connecting */
unsigned long ttp_open; /* Set when IrTTP is ready */
unsigned long ttp_connect; /* Set when IrTTP is connecting */
struct tsap_cb * tsap; /* IrTTP instance (the connection) */
char rname[NICKNAME_MAX_LEN + 1];
......
......@@ -860,7 +860,7 @@ ppp_irnet_send(struct ppp_channel * chan,
irda_irnet_connect(self);
#endif /* CONNECT_IN_SEND */
DEBUG(PPP_INFO, "IrTTP not ready ! (%d-%d)\n",
DEBUG(PPP_INFO, "IrTTP not ready ! (%ld-%ld)\n",
self->ttp_open, self->ttp_connect);
/* Note : we can either drop the packet or block the packet.
......
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