Back to home page

OSCL-LXR

 
 

    


0001 #ifndef __DRIVERS_PARIDE_H__
0002 #define __DRIVERS_PARIDE_H__
0003 
0004 /* 
0005     paride.h    (c) 1997-8  Grant R. Guenther <grant@torque.net>
0006                             Under the terms of the GPL.
0007 
0008    This file defines the interface between the high-level parallel
0009    IDE device drivers (pd, pf, pcd, pt) and the adapter chips.
0010 
0011 */
0012 
0013 /* Changes:
0014 
0015     1.01    GRG 1998.05.05  init_proto, release_proto
0016 */
0017 
0018 #define PARIDE_H_VERSION    "1.01"
0019 
0020 /* Some adapters need to know what kind of device they are in
0021 
0022    Values for devtype:
0023 */
0024 
0025 #define PI_PD   0   /* IDE disk */
0026 #define PI_PCD  1   /* ATAPI CDrom */
0027 #define PI_PF   2   /* ATAPI disk */
0028 #define PI_PT   3   /* ATAPI tape */
0029 #define PI_PG   4       /* ATAPI generic */
0030 
0031 /* The paride module contains no state, instead the drivers allocate
0032    a pi_adapter data structure and pass it to paride in every operation.
0033 
0034 */
0035 
0036 struct pi_adapter  {
0037 
0038     struct pi_protocol *proto;   /* adapter protocol */
0039     int port;            /* base address of parallel port */
0040     int mode;            /* transfer mode in use */
0041     int     delay;           /* adapter delay setting */
0042     int devtype;         /* device type: PI_PD etc. */
0043     char    *device;         /* name of driver */
0044     int     unit;            /* unit number for chained adapters */
0045     int saved_r0;        /* saved port state */
0046     int saved_r2;        /* saved port state */
0047     int reserved;        /* number of ports reserved */
0048     unsigned long   private;     /* for protocol module */
0049 
0050     wait_queue_head_t parq;     /* semaphore for parport sharing */
0051     void    *pardev;         /* pointer to pardevice */
0052     char    *parname;        /* parport name */
0053     int claimed;         /* parport has already been claimed */
0054     void (*claim_cont)(void);    /* continuation for parport wait */
0055 };
0056 
0057 typedef struct pi_adapter PIA;
0058 
0059 /* functions exported by paride to the high level drivers */
0060 
0061 extern int pi_init(PIA *pi, 
0062     int autoprobe,      /* 1 to autoprobe */
0063     int port,       /* base port address */
0064     int mode,       /* -1 for autoprobe */
0065     int unit,       /* unit number, if supported */
0066     int protocol,       /* protocol to use */
0067     int delay,      /* -1 to use adapter specific default */
0068     char * scratch,     /* address of 512 byte buffer */
0069     int devtype,        /* device type: PI_PD, PI_PCD, etc ... */
0070     int verbose,        /* log verbose data while probing */
0071     char *device        /* name of the driver */
0072     );          /* returns 0 on failure, 1 on success */
0073 
0074 extern void pi_release(PIA *pi);
0075 
0076 /* registers are addressed as (cont,regr)
0077 
0078         cont: 0 for command register file, 1 for control register(s)
0079     regr: 0-7 for register number.
0080 
0081 */
0082 
0083 extern void pi_write_regr(PIA *pi, int cont, int regr, int val);
0084 
0085 extern int pi_read_regr(PIA *pi, int cont, int regr);
0086 
0087 extern void pi_write_block(PIA *pi, char * buf, int count);
0088 
0089 extern void pi_read_block(PIA *pi, char * buf, int count);
0090 
0091 extern void pi_connect(PIA *pi);
0092 
0093 extern void pi_disconnect(PIA *pi);
0094 
0095 extern void pi_do_claimed(PIA *pi, void (*cont)(void));
0096 extern int pi_schedule_claimed(PIA *pi, void (*cont)(void));
0097 
0098 /* macros and functions exported to the protocol modules */
0099 
0100 #define delay_p         (pi->delay?udelay(pi->delay):(void)0)
0101 #define out_p(offs,byte)    outb(byte,pi->port+offs); delay_p;
0102 #define in_p(offs)      (delay_p,inb(pi->port+offs))
0103 
0104 #define w0(byte)                {out_p(0,byte);}
0105 #define r0()                    (in_p(0) & 0xff)
0106 #define w1(byte)                {out_p(1,byte);}
0107 #define r1()                    (in_p(1) & 0xff)
0108 #define w2(byte)                {out_p(2,byte);}
0109 #define r2()                    (in_p(2) & 0xff)
0110 #define w3(byte)                {out_p(3,byte);}
0111 #define w4(byte)                {out_p(4,byte);}
0112 #define r4()                    (in_p(4) & 0xff)
0113 #define w4w(data)           {outw(data,pi->port+4); delay_p;}
0114 #define w4l(data)           {outl(data,pi->port+4); delay_p;}
0115 #define r4w()               (delay_p,inw(pi->port+4)&0xffff)
0116 #define r4l()               (delay_p,inl(pi->port+4)&0xffffffff)
0117 
0118 static inline u16 pi_swab16( char *b, int k)
0119 
0120 {   union { u16 u; char t[2]; } r;
0121 
0122     r.t[0]=b[2*k+1]; r.t[1]=b[2*k];
0123         return r.u;
0124 }
0125 
0126 static inline u32 pi_swab32( char *b, int k)
0127 
0128 {   union { u32 u; char f[4]; } r;
0129 
0130     r.f[0]=b[4*k+1]; r.f[1]=b[4*k];
0131     r.f[2]=b[4*k+3]; r.f[3]=b[4*k+2];
0132         return r.u;
0133 }
0134 
0135 struct pi_protocol {
0136 
0137     char    name[8];    /* name for this protocol */
0138     int index;      /* index into protocol table */
0139 
0140     int max_mode;   /* max mode number */
0141     int epp_first;  /* modes >= this use 8 ports */
0142     
0143     int default_delay;  /* delay parameter if not specified */
0144     int max_units;  /* max chained units probed for */
0145 
0146     void (*write_regr)(PIA *,int,int,int);
0147     int  (*read_regr)(PIA *,int,int);
0148     void (*write_block)(PIA *,char *,int);
0149     void (*read_block)(PIA *,char *,int);
0150 
0151     void (*connect)(PIA *);
0152     void (*disconnect)(PIA *);
0153     
0154     int  (*test_port)(PIA *);
0155     int  (*probe_unit)(PIA *);
0156     int  (*test_proto)(PIA *,char *,int);
0157     void (*log_adapter)(PIA *,char *,int);
0158     
0159     int (*init_proto)(PIA *);
0160     void (*release_proto)(PIA *);
0161     struct module *owner;
0162 };
0163 
0164 typedef struct pi_protocol PIP;
0165 
0166 extern int paride_register( PIP * );
0167 extern void paride_unregister ( PIP * );
0168 void *pi_register_driver(char *);
0169 void pi_unregister_driver(void *);
0170 
0171 #endif /* __DRIVERS_PARIDE_H__ */
0172 /* end of paride.h */