#ifndef H_DEVICES
#define H_DEVICES

enum deviceTypes { DEVICE_NONE = 0, DEVICE_HD, DEVICE_FD, DEVICE_CDROM, 
			DEVICE_TAPE };
enum driverTypes { DRIVER_SCSI = 0, DRIVER_NET = 1, DRIVER_CDROM = 2,
		   DRIVER_PCMCIA = 3, DRIVER_FS = 4, 
		   DRIVER_PREREQ = 4, DRIVER_OTHER = 1000};
enum driverMinor { DRIVER_MINOR_NONE = 0, DRIVER_MINOR_ETHERNET,
		   DRIVER_MINOR_PLIP, DRIVER_MINOR_TR };

struct driver;

#define PERSIST_ALIAS	(1 << 0)
#define PERSIST_OPTIONS	(1 << 1)

struct deviceInfo {
    char * deviceName;
    char * info;
    int id;
    int bus;
    int type;
};

struct driversLoaded {
    struct driversLoaded * next;
    char ** argv;
    int argc;
    char * module;
    enum driverTypes type;
    enum driverMinor minor;
    int persistFlags;
} ;

typedef int (*driverOkayFn)(struct driver * dev);

int devMakeInode(char * name, char * path);
void devRemoveInode(char * path);
int loadDeviceDriver(enum driverTypes type, struct driversLoaded ** drlist,
		     int justProbe);
int removeDeviceDriver(enum driverTypes type, struct driversLoaded ** drlist);
int writeModuleConf(char * prefix, struct driversLoaded * dl, int append);
int readModuleConf(char * prefix, struct driversLoaded ** drlist);
int readModuleConfPersist(char * prefix, struct driversLoaded * drlist);
int loadModule(char * modName, enum driverTypes type, enum driverMinor minor,
	       struct driversLoaded ** drlist);
int removeModule(char * module);
int setupCDdevice(char ** cddev, struct driversLoaded ** dl);
int removeCDmodule(struct driversLoaded ** dl);
int loadFilesystem(char * name, struct driversLoaded ** drlist);

/* returns a list of cd devices, NULL terminated */
char ** getCDnames(void);

/* hack -- plip is broken */
char * getPlipDeviceName(void);

#ifndef __sparc__
int findAtapi(char ** cddev);
#endif
int findSCSIcdrom(char ** cddev);

#endif