/* * Copyright (c) 1995 Andrew McRae. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ * * Common include file for PCMCIA daemon */ #include #include #include #include "readcis.h" #ifndef EXTERN #define EXTERN extern #endif struct cmd { struct cmd *next; char *line; /* Command line */ int macro; /* Contains macros */ }; struct card_config { struct card_config *next; unsigned char index_type; unsigned char index; struct driver *driver; int irq; int flags; char inuse; }; struct ether { struct ether *next; int type; int value; }; #define ETHTYPE_GENERIC 0 #define ETHTYPE_ATTR2 1 struct card { struct card *next; char *manuf; char *version; char *add_info1; char *add_info2; u_char func_id; int deftype; struct ether *ether; /* For net cards, ether at offset */ int reset_time; /* Reset time */ int iosize; /* I/O window size (ignore location) */ struct card_config *config; /* List of configs */ struct cmd *insert; /* Insert commands */ struct cmd *remove; /* Remove commands */ char *logstr; /* String for logger */ }; struct driver { struct driver *next; char *name; char *kernel; /* Kernel driver base name */ int unit; /* Unit of driver */ /* * The rest of the structure is allocated dynamically. * Once allocated, it stays allocated. */ struct card *card; /* Current card, if any */ struct card_config *config; /* Config back ptr */ unsigned int mem; /* Allocated host address (if any) */ int inuse; }; /* * Defines one allocation block i.e a starting address * and size. Used for either memory or I/O ports */ struct allocblk { struct allocblk *next; int addr; /* Address */ int size; /* Size */ int flags; /* Flags for block */ int cardaddr; /* Card address */ }; /* * Slot structure - data held for each slot. */ struct slot { struct slot *next; int fd; int mask; int slot; char *name; enum cardstate state; struct cis *cis; struct card *card; /* Current card */ struct card_config *config; /* Current configuration */ struct cis_config *card_config; char devname[16]; unsigned char eaddr[6]; /* If any */ struct allocblk io; /* I/O block spec */ struct allocblk mem; /* Memory block spec */ int irq; /* Irq value */ int flags; /* Resource assignment flags */ }; /* * Slot resource assignment/configuration flags */ #define IO_ASSIGNED 0x1 #define MEM_ASSIGNED 0x2 #define IRQ_ASSIGNED 0x4 #define EADDR_CONFIGED 0x8 #define WL_CONFIGED 0x10 #define AFLAGS (IO_ASSIGNED | MEM_ASSIGNED | IRQ_ASSIGNED) #define CFLAGS (EADDR_CONFIGED | WL_CONFIGED) EXTERN struct slot *slots, *current_slot; EXTERN int slen; EXTERN struct allocblk *pool_ioblks; /* I/O blocks in the pool */ EXTERN struct allocblk *pool_mem; /* Memory in the pool */ EXTERN int pool_irq[16]; /* IRQ allocations */ EXTERN int irq_init[16]; /* initial IRQ allocations */ EXTERN struct driver *drivers; /* List of drivers */ EXTERN struct card *cards; EXTERN struct card *last_card; EXTERN bitstr_t *mem_avail; EXTERN bitstr_t *mem_init; EXTERN bitstr_t *io_avail; EXTERN bitstr_t *io_init; EXTERN int pccard_init_sleep; /* Time to sleep on init */ EXTERN int use_kern_irq; EXTERN int debug_level; /* cardd.c functions */ void dump_config_file(void); struct slot *readslots(void); void slot_change(struct slot *); /* util.c functions */ unsigned long alloc_memory(int); int bit_fns(bitstr_t *, int, int, int, int); void die(char *); void execute(struct cmd *, struct slot *); void logmsg(const char *, ...); void log_setup(void); void logerr(char *); char *newstr(); void reset_slot(struct slot *); void *xmalloc(int); /* file.c functions */ void readfile(char *); /* server.c functions */ void set_socket(int); void stat_changed(struct slot *); void process_client(void); #define IOPORTS 0x400 #define MEMUNIT 0x1000 #define MEMSTART 0xA0000 #define MEMEND 0x100000 #define MEMBLKS ((MEMEND-MEMSTART)/MEMUNIT) #define MEM2BIT(x) (((x)-MEMSTART)/MEMUNIT) #define BIT2MEM(x) (((x)*MEMUNIT)+MEMSTART) #define MAXINCLUDES 10 #define MAXERRORS 10 /* * Config index types */ #define NORMAL_INDEX 0 #define DEFAULT_INDEX 1 #define AUTO_INDEX 2 #define DT_VERS 0 #define DT_FUNC 1