summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Schweizer <genstef@gentoo.org>2007-02-05 23:08:15 +0000
committerStefan Schweizer <genstef@gentoo.org>2007-02-05 23:08:15 +0000
commit8cac49c40c57d1c9f9ee70ae3e807c019c9c9519 (patch)
treea30b3abdf9cc96ced9786223351541bc3c911e5c /net-dialup/fritzcapi/files
parentStable on x86. Requested by drac. (diff)
downloadgentoo-2-8cac49c40c57d1c9f9ee70ae3e807c019c9c9519.tar.gz
gentoo-2-8cac49c40c57d1c9f9ee70ae3e807c019c9c9519.tar.bz2
gentoo-2-8cac49c40c57d1c9f9ee70ae3e807c019c9c9519.zip
Fix fcpcmcia build thanks to Peter Eisenlohr in bug 163366
(Portage version: 2.1.2-r7)
Diffstat (limited to 'net-dialup/fritzcapi/files')
-rw-r--r--net-dialup/fritzcapi/files/2.6.43-fcpcmcia.patch621
1 files changed, 621 insertions, 0 deletions
diff --git a/net-dialup/fritzcapi/files/2.6.43-fcpcmcia.patch b/net-dialup/fritzcapi/files/2.6.43-fcpcmcia.patch
new file mode 100644
index 000000000000..aae12b1ff030
--- /dev/null
+++ b/net-dialup/fritzcapi/files/2.6.43-fcpcmcia.patch
@@ -0,0 +1,621 @@
+diff -ur usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/driver.h usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/driver.h
+--- usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/driver.h 2005-07-07 00:00:00.000000000 +0200
++++ usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/driver.h 2007-01-25 11:39:11.000000000 +0100
+@@ -23,7 +23,6 @@
+ #ifndef __have_driver_h__
+ #define __have_driver_h__
+
+-#include <linux/config.h>
+ #include <linux/skbuff.h>
+ #include <linux/capi.h>
+ #include <linux/list.h>
+diff -ur usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/fcpcmcia_cs.c usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/fcpcmcia_cs.c
+--- usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/fcpcmcia_cs.c 2006-01-30 17:09:05.000000000 +0100
++++ usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/fcpcmcia_cs.c 2007-02-05 21:43:14.000000000 +0100
+@@ -46,7 +46,6 @@
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
+ #define PCMCIA_IRQ_INFO2
+ #endif
+-#define NEW_PCMCIA_DRV
+
+ /*====================================================================*/
+ MODULE_LICENSE("GPL");
+@@ -111,13 +110,9 @@
+ handler.
+ */
+
+-static void cs_config(dev_link_t *);
+-static void cs_release(dev_link_t *);
+-#ifdef NEW_PCMCIA_DRV
+-static void cs_detach(struct pcmcia_device *p_dev);
+-static int cs_attach(struct pcmcia_device *p_dev);
+-#else
+-static int cs_event(event_t event, int priority, event_callback_args_t *);
++static int cs_config(struct pcmcia_device *link);
++static void cs_release(struct pcmcia_device *link);
++
+
+ /*
+ The attach() and detach() entry points are used to create and destroy
+@@ -125,48 +120,33 @@
+ needed to manage one actual PCMCIA card.
+ */
+
+-static dev_link_t * cs_attach(void);
+-static void cs_detach(dev_link_t *);
+-/*
+- The dev_info variable is the "key" that is used to match up this
+- device driver with appropriate cards, through the card configuration
+- database.
+-*/
++static void cs_detach(struct pcmcia_device *p_dev);
+
+-static dev_info_t dev_info = "fcpcmcia_cs";
+
+ /*
+ A linked list of "instances" of the skeleton device. Each actual
+ PCMCIA card corresponds to one device instance, and is described
+- by one dev_link_t structure (defined in ds.h).
++ by one struct pcmcia_device structure (defined in ds.h).
+
+ You may not want to use a linked list for this -- for example, the
+- memory card driver uses an array of dev_link_t pointers, where minor
++ memory card driver uses an array of struct pcmcia_device pointers, where minor
+ device numbers are used to derive the corresponding array index.
+ */
+
+-static dev_link_t *dev_list = NULL;
+
+-#endif
+ /*
+- A dev_link_t structure has fields for most things that are needed
+- to keep track of a socket, but there will usually be some device
+- specific information that also needs to be kept track of. The
+- 'priv' pointer in a dev_link_t structure can be used to point to
+- a device-specific private data structure, like this.
+-
+ A driver needs to provide a dev_node_t structure for each device
+ on a card. In some cases, there is only one device per card (for
+ example, ethernet cards, modems). In other cases, there may be
+ many actual or logical devices (SCSI adapters, memory cards with
+ multiple partitions). The dev_node_t structures need to be kept
+- in a linked list starting at the 'dev' field of a dev_link_t
++ in a linked list starting at the 'dev' field of a struct pcmcia_device
+ structure. We allocate them in the card's private data structure,
+ because they generally can't be allocated dynamically.
+ */
+
+ typedef struct local_info_t {
+- dev_node_t node;
++ dev_node_t node;
+ } local_info_t;
+
+ /*======================================================================
+@@ -181,101 +161,52 @@
+
+ ======================================================================*/
+
+-#ifdef NEW_PCMCIA_DRV
+-static int cs_attach(struct pcmcia_device *p_dev)
++static int cs_probe(struct pcmcia_device *p_dev)
+ {
+-#else
+-static dev_link_t *cs_attach(void)
+-{
+- client_reg_t client_reg;
+- int ret;
+-#endif
+- dev_link_t *link;
+- local_info_t *local;
++ local_info_t *local;
+ #if defined (PCMCIA_IRQ_INFO2)
+- int i;
++ int i;
+ #endif
+
+- NOTE("Attaching device...\n");
++ NOTE("Attaching device...\n");
+
+- /* Initialize the dev_link_t structure */
+- link = kmalloc(sizeof(struct dev_link_t), GFP_KERNEL);
+- if (!link)
+- goto err;
+- memset(link, 0, sizeof(struct dev_link_t));
+-
+- /* The io structure describes IO port mapping */
+- link->io.NumPorts1 = 16;
+- link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
+- link->io.NumPorts2 = 0;
++ /* The io structure describes IO port mapping */
++ p_dev->io.NumPorts1 = 16;
++ p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
++ p_dev->io.NumPorts2 = 0;
+
+- /* Interrupt setup */
+- link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
++ /* Interrupt setup */
++ p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
+
+ #if defined (PCMCIA_IRQ_INFO2)
+- link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
+- if (irq_list_count > 0) {
+- for (i = 0; (i < irq_list_count) && (irq_list[i] > 0); i++)
+- link->irq.IRQInfo2 |= 1 << irq_list[i];
+- } else {
+- for (i = 0; (i < irq_list_count) && (default_irq_list[i] > 0); i++)
+- link->irq.IRQInfo2 |= 1 << default_irq_list[i];
+- }
++ p_dev->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
++ if (irq_list_count > 0) {
++ for (i = 0; (i < irq_list_count) && (irq_list[i] > 0); i++)
++ p_dev->irq.IRQInfo2 |= 1 << irq_list[i];
++ } else {
++ for (i = 0; (i < irq_list_count) && (default_irq_list[i] > 0); i++)
++ p_dev->irq.IRQInfo2 |= 1 << default_irq_list[i];
++ }
+ #else
+- link->irq.IRQInfo1 = IRQ_LEVEL_ID;
++ p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
+ #endif
+
+- /* General socket configuration */
+- link->conf.Attributes = CONF_ENABLE_IRQ;
+- link->conf.Vcc = 50;
+- link->conf.IntType = INT_MEMORY_AND_IO;
+- link->conf.ConfigIndex = 1;
+- link->conf.Present = PRESENT_OPTION;
+-
+- /* Allocate space for private device-specific data */
+- local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
+- if (!local)
+- goto err_kfree;
+- memset(local, 0, sizeof(local_info_t));
+- link->priv = local;
+-
+-#ifdef NEW_PCMCIA_DRV
+- link->handle = p_dev;
+- p_dev->instance = link;
+- link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+- cs_config(link);
+- return 0;
+-#else
+- /* Register with Card Services */
+- link->next = dev_list;
+- dev_list = link;
+- client_reg.dev_info = &dev_info;
+-#if 0
+- client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
+- client_reg.EventMask =
+- CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
+- CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
+- CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
+- client_reg.event_handler = &cs_event;
+-#endif
+- client_reg.Version = 0x0210;
+- client_reg.event_callback_args.client_data = link;
+- ret = pcmcia_register_client(&link->handle, &client_reg);
+- if (ret != 0) {
+- cs_error(link->handle, RegisterClient, ret);
+- cs_detach(link);
+- goto err;
+- }
+- return link;
+-#endif
+- err_kfree:
+- kfree(link);
+- err:
+-#ifdef NEW_PCMCIA_DRV
+- return -EINVAL;
+-#else
+- return NULL;
+-#endif
++ /* General socket configuration */
++ p_dev->conf.Attributes = CONF_ENABLE_IRQ;
++ p_dev->conf.IntType = INT_MEMORY_AND_IO;
++ p_dev->conf.ConfigIndex = 1;
++ p_dev->conf.Present = PRESENT_OPTION;
++
++ /* Allocate space for private device-specific data */
++ local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
++ if (!local)
++ goto err_kfree;
++ memset(local, 0, sizeof(local_info_t));
++ p_dev->priv = local;
++ return cs_config(p_dev);
++
++err_kfree:
++ return -ENOMEM;
+ } /* cs_attach */
+
+ /*======================================================================
+@@ -286,47 +217,12 @@
+ when the device is released.
+
+ ======================================================================*/
+-#ifdef NEW_PCMCIA_DRV
+-static void cs_detach(struct pcmcia_device *p_dev)
+-{
+- dev_link_t *link = dev_to_instance(p_dev);
+
+- if (link->state & DEV_CONFIG)
+- cs_release(link);
+-#else
+-static void cs_detach(dev_link_t *link)
++static void cs_detach(struct pcmcia_device *link)
+ {
+- dev_link_t **linkp;
+-
+- NOTE("Detaching device...\n");
+-
+- /* Locate device structure */
+- for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
+- if (*linkp == link) break;
+- if (*linkp == NULL)
+- return;
+-
+- /*
+- If the device is currently configured and active, we won't
+- actually delete it yet. Instead, it is marked so that when
+- the release() function is called, that will trigger a proper
+- detach().
+- */
+- if (link->state & DEV_CONFIG) {
+- link->state |= DEV_STALE_LINK;
+- return;
+- }
+-
+- /* Break the link with Card Services */
+- if (link->handle)
+- pcmcia_deregister_client(link->handle);
+-
+- /* Unlink device structure, free pieces */
+- *linkp = link->next;
+-#endif
+- kfree(link->priv);
+- kfree(link);
+-} /* cs_detach */
++ cs_release(link);
++ kfree(link->priv);
++}
+
+ /*======================================================================
+
+@@ -336,14 +232,15 @@
+
+ ======================================================================*/
+
+-static int get_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
++static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple,
++ cisparse_t *parse)
+ {
+ int i = pcmcia_get_tuple_data(handle, tuple);
+ if (i != CS_SUCCESS) return i;
+ return pcmcia_parse_tuple(handle, tuple, parse);
+ }
+
+-static int first_tuple(client_handle_t handle, tuple_t *tuple,
++static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
+ cisparse_t *parse)
+ {
+ int i = pcmcia_get_first_tuple(handle, tuple);
+@@ -351,7 +248,7 @@
+ return get_tuple(handle, tuple, parse);
+ }
+
+-static int next_tuple(client_handle_t handle, tuple_t *tuple,
++static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
+ cisparse_t *parse)
+ {
+ int i = pcmcia_get_next_tuple(handle, tuple);
+@@ -359,9 +256,8 @@
+ return get_tuple(handle, tuple, parse);
+ }
+
+-static void cs_config(dev_link_t *link)
++static int cs_config(struct pcmcia_device *link)
+ {
+- client_handle_t handle;
+ tuple_t tuple;
+ cisparse_t parse;
+ cistpl_cftable_entry_t *cf = &parse.cftable_entry;
+@@ -369,7 +265,6 @@
+ int i;
+ u_char buf[64];
+ char devname[128];
+- handle = link->handle;
+ dev = link->priv;
+
+ /*
+@@ -378,25 +273,21 @@
+ */
+ do {
+ tuple.DesiredTuple = CISTPL_CONFIG;
+- i = pcmcia_get_first_tuple(handle, &tuple);
++ i = pcmcia_get_first_tuple(link, &tuple);
+ if (i != CS_SUCCESS) break;
+ tuple.TupleData = buf;
+ tuple.TupleDataMax = 64;
+ tuple.TupleOffset = 0;
+- i = pcmcia_get_tuple_data(handle, &tuple);
++ i = pcmcia_get_tuple_data(link, &tuple);
+ if (i != CS_SUCCESS) break;
+- i = pcmcia_parse_tuple(handle, &tuple, &parse);
++ i = pcmcia_parse_tuple(link, &tuple, &parse);
+ if (i != CS_SUCCESS) break;
+ link->conf.ConfigBase = parse.config.base;
+ } while (0);
+ if (i != CS_SUCCESS) {
+- cs_error(link->handle, ParseTuple, i);
+- link->state &= ~DEV_CONFIG_PENDING;
+- return;
++ cs_error(link, ParseTuple, i);
++ return -ENODEV;
+ }
+-
+- /* Configure card */
+- link->state |= DEV_CONFIG;
+
+ do {
+
+@@ -407,7 +298,7 @@
+ tuple.DesiredTuple = CISTPL_VERS_1;
+
+ devname[0] = 0;
+- if( !first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 1 ) {
++ if( !first_tuple(link, &tuple, &parse) && parse.version_1.ns > 1 ) {
+ strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1],
+ sizeof(devname));
+ }
+@@ -418,7 +309,7 @@
+ tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
+ tuple.Attributes = 0;
+ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
+- i = first_tuple(handle, &tuple, &parse);
++ i = first_tuple(link, &tuple, &parse);
+ while (i == CS_SUCCESS) {
+ if (cf->io.nwin > 0) {
+ link->conf.ConfigIndex = cf->index;
+@@ -428,36 +319,36 @@
+ NOTE("testing i/o %#x-%#x\n",
+ link->io.BasePort1,
+ link->io.BasePort1+link->io.NumPorts1-1);
+- i = pcmcia_request_io(link->handle, &link->io);
++ i = pcmcia_request_io(link, &link->io);
+ if (i == CS_SUCCESS) goto found_port;
+ }
+- i = next_tuple(handle, &tuple, &parse);
++ i = next_tuple(link, &tuple, &parse);
+ }
+
+ found_port:
+ if (i != CS_SUCCESS) {
+- cs_error(link->handle, RequestIO, i);
++ cs_error(link, RequestIO, i);
+ break;
+ }
+
+ /*
+ * allocate an interrupt line
+ */
+- i = pcmcia_request_irq(link->handle, &link->irq);
++ i = pcmcia_request_irq(link, &link->irq);
+ if (i != CS_SUCCESS) {
+- cs_error(link->handle, RequestIRQ, i);
+- pcmcia_release_io(link->handle, &link->io);
++ cs_error(link, RequestIRQ, i);
++ /* undo */
++ pcmcia_disable_device(link);
+ break;
+ }
+
+ /*
+ * configure the PCMCIA socket
+ */
+- i = pcmcia_request_configuration(link->handle, &link->conf);
++ i = pcmcia_request_configuration(link, &link->conf);
+ if (i != CS_SUCCESS) {
+- cs_error(link->handle, RequestConfiguration, i);
+- pcmcia_release_io(link->handle, &link->io);
+- pcmcia_release_irq(link->handle, &link->irq);
++ cs_error(link, RequestConfiguration, i);
++ pcmcia_disable_device(link);
+ break;
+ }
+
+@@ -469,14 +360,13 @@
+ strcpy(dev->node.dev_name, "A1");
+ dev->node.major = 64;
+ dev->node.minor = 0;
+- link->dev = &dev->node;
+-
+- link->state &= ~DEV_CONFIG_PENDING;
++
++ link->dev_node = &dev->node;
+ /* If any step failed, release any partially configured state */
+ if (i != 0) {
+ ERROR("Failed to setup controller, releasing link...\n");
+ cs_release(link);
+- return;
++ return -ENODEV;
+ }
+ NOTE("Ready to call card driver for '%s'...\n", devname);
+
+@@ -488,7 +378,7 @@
+ link->irq.AssignedIRQ
+ );
+ cs_release(link);
+- return;
++ return -ENODEV;
+ }
+ dev->node.minor = i;
+
+@@ -498,6 +388,7 @@
+ link->io.BasePort1,
+ link->irq.AssignedIRQ
+ );
++ return 0;
+ } /* cs_config */
+
+ /*======================================================================
+@@ -508,96 +399,13 @@
+
+ ======================================================================*/
+
+-static void cs_release(dev_link_t *link)
++static void cs_release(struct pcmcia_device *link)
+ {
+ fcpcmcia_delcard(link->io.BasePort1, link->irq.AssignedIRQ);
+
+- /* Unlink the device chain */
+- link->dev = NULL;
+-
+- /* Don't bother checking to see if these succeed or not */
+- pcmcia_release_configuration(link->handle);
+- pcmcia_release_io(link->handle, &link->io);
+- pcmcia_release_irq(link->handle, &link->irq);
+- link->state &= ~DEV_CONFIG;
+-
+-#ifndef NEW_PCMCIA_DRV
+- if (link->state & DEV_STALE_LINK)
+- cs_detach(link);
+-#endif
++ pcmcia_disable_device(link);
+ } /* cs_release */
+
+-#ifdef NEW_PCMCIA_DRV
+-static int cs_suspend(struct pcmcia_device *dev)
+-{
+- dev_link_t *link = dev_to_instance(dev);
+-
+- link->state |= DEV_SUSPEND;
+- if (link->state & DEV_CONFIG)
+- pcmcia_release_configuration(link->handle);
+-
+- return 0;
+-}
+-
+-static int cs_resume(struct pcmcia_device *dev)
+-{
+- dev_link_t *link = dev_to_instance(dev);
+-
+- link->state &= ~DEV_SUSPEND;
+- if (link->state & DEV_CONFIG)
+- pcmcia_request_configuration(link->handle, &link->conf);
+-
+- return 0;
+-}
+-#else
+-/*======================================================================
+-
+- The card status event handler. Mostly, this schedules other
+- stuff to run after an event is received. A CARD_REMOVAL event
+- also sets some flags to discourage the net drivers from trying
+- to talk to the card any more.
+-
+- When a CARD_REMOVAL event is received, we immediately set a flag
+- to block future accesses to this device. All the functions that
+- actually access the device should check this flag to make sure
+- the card is still present.
+-
+-======================================================================*/
+-
+-static int cs_event(event_t event, int priority, event_callback_args_t *args)
+-{
+- dev_link_t *link = args->client_data;
+-
+- LOG("Card service event: %x\n", event);
+- switch (event) {
+- case CS_EVENT_CARD_REMOVAL:
+- link->state &= ~DEV_PRESENT;
+- if (link->state & DEV_CONFIG)
+- cs_release(link);
+- break;
+- case CS_EVENT_CARD_INSERTION:
+- link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
+- cs_config(link);
+- break;
+- case CS_EVENT_PM_SUSPEND:
+- link->state |= DEV_SUSPEND;
+- /* Fall through... */
+- case CS_EVENT_RESET_PHYSICAL:
+- if (link->state & DEV_CONFIG)
+- pcmcia_release_configuration(link->handle);
+- break;
+- case CS_EVENT_PM_RESUME:
+- link->state &= ~DEV_SUSPEND;
+- /* Fall through... */
+- case CS_EVENT_CARD_RESET:
+- if (link->state & DEV_CONFIG)
+- pcmcia_request_configuration(link->handle, &link->conf);
+- break;
+- }
+- return 0;
+-} /* cs_event */
+-#endif
+-
+ static struct pcmcia_device_id fcpcmcia_ids[] = {
+ PCMCIA_DEVICE_PROD_ID12("AVM", "ISDN A", 0x95d42008, 0xadc9d4bb),
+ PCMCIA_DEVICE_PROD_ID12("ISDN", "CARD", 0x8d9761c8, 0x01c5aa7b),
+@@ -610,17 +418,10 @@
+ .drv = {
+ .name = "fcpcmcia_cs",
+ },
+-#ifdef NEW_PCMCIA_DRV
+- .probe = cs_attach,
+- .remove = cs_detach,
+- .suspend= cs_suspend,
+- .resume = cs_resume,
+-#else
+- .attach = cs_attach,
+- .detach = cs_detach,
+- .event = cs_event,
+-#endif
+- .id_table = fcpcmcia_ids,
++ .probe = cs_probe,
++ .remove = cs_detach,
++ .id_table = fcpcmcia_ids,
++
+ };
+
+ static int __init cs_init(void)
+@@ -631,6 +432,7 @@
+ static void __exit cs_exit(void)
+ {
+ pcmcia_unregister_driver(&cs_driver);
++
+ }
+
+ module_init(cs_init);
+diff -ur usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/main.c usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/main.c
+--- usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/main.c 2005-07-07 00:00:00.000000000 +0200
++++ usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/main.c 2007-01-25 11:39:11.000000000 +0100
+@@ -22,7 +22,6 @@
+
+ #include <stdarg.h>
+ #include <asm/uaccess.h>
+-#include <linux/config.h>
+ #include <linux/version.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+diff -ur usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/tools.h usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/tools.h
+--- usr.orig/src/kernel-modules/fritzcapi/fritz.pcmcia/src/tools.h 2006-01-30 17:09:05.000000000 +0100
++++ usr/src/kernel-modules/fritzcapi/fritz.pcmcia/src/tools.h 2007-01-25 11:38:56.000000000 +0100
+@@ -69,16 +69,8 @@
+ extern void lprintf (const char *, const char *, ...);
+ extern void vlprintf (const char *, const char *, va_list);
+
+-/*---------------------------------------------------------------------------*\
+-\*---------------------------------------------------------------------------*/
+-#ifndef atomic_xchg
+-static inline unsigned long atomic_xchg (
+- volatile atomic_t * v,
+- unsigned value
+-) {
+- return __xchg (value, &v->counter, sizeof (unsigned));
+-} /* atomic_xchg */
+-#endif
++
++
+ /*---------------------------------------------------------------------------*\
+ \*---------------------------------------------------------------------------*/
+ #ifndef NDEBUG