
struct lun_map {
    __u8   id:5,
         chan:3;
    __u8 lun;
};

typedef struct emul_pp {
    __u8 p_code:6,
           null:1,
         p_save:1;
    __u8 p_length;
    __u16 cylinder;
    __u8 heads;
    __u8 sectors;
    __u8 null2;
    __u8 s_lunmap:4,
              ems:1;
    __u16 drive_type;   /* In Little Endian ! */
    struct lun_map lunmap[4];
}emulpp;


/* Log Sense pages */

typedef struct log_sheader {
    __u8 page_code,
         reserved;
    __u16 length;
}logsh;


/* Log Sense Statistics */

typedef struct read_command_statistics {
    __u16 code;        /* 0x01 */
    __u8  flags;
    __u8  length;      /* 0x24 */
    __u32 h_commands,
          uncached,
          la_cmds,
          la_blks,
          la_hits,
          missed,
          hits,
          seq_la_blks,
          seq_la_hits;
}r_cmd_stat;

typedef struct write_command_statistics {
    __u16 code;        /* 0x03 */
    __u8  flags;
    __u8  length;      /* 0x28 */
    __u32 h_commands,
          uncached,
          thru,
          bypass,
          soft_err,
          hits,
          b_idle,
          b_activ,
          b_blks,
          b_blks_clean;
}w_cmd_stat;

typedef struct host_command_statistics {
    __u16 code;          /* 0x02, 0x04 */
    __u8  flags;
    __u8  length;        /* 0x30 */
    __u32 sizes[12];
}hst_cmd_stat;

typedef struct physical_command_statistics {
    __u16 code;          /* 0x06, 0x07 */ 
    __u8  flags;
    __u8  length;        /* 0x34 */
    __u32 sizes[13]; 
}phy_cmd_stat;

typedef struct misc_device_statistics {
    __u16 code;           /* 0x05 */
    __u8  flags;
    __u8  length;         /* 0x10 */
    __u32 disconnect,
          pass_thru,
          sg_commands,
          stripe_boundary_crosses;
}msc_stats;
 
/* Configuration Pages */

typedef struct controller_configuration {
    __u16 code;           /* 0x01 */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  intt:1,
           sec:1,
           csh:1,
           key:1,
           tmr:1,
           srs:1,
           nvr:1;
    __u8  interrupt;
}coco;

typedef struct controller_hardware_errors {
    __u16 code;           /* 0x02 */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  unused:1,
             per:1;
    __u8  interrupt;
}coher;

typedef struct memory_map {
    __u16 code;           /* 0x03, 0x04 */
    __u8  flags;
    __u8  length;         /* 0x04 */
    __u32 memory_map;
}mema;

typedef struct scsi_transfer {
    __u16 code;           /* 0x05 */
    __u8  flags;
    __u8  length;         /* 0x04 */
    __u8  offset,
          period;
    __u16 speed;
}scsitrans;

typedef struct scsi_modes {
    __u16 code;           /* 0x06 */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  que:1,
         cdis:1,
         wtru:1,
         dasd:1,
          ncr:1,
         awre:1;
    __u8  reserved;
}scsimod;

typedef struct host_bus {
    __u16 code;           /* 0x07 */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  speed:6,
            pci:1,
           eisa:1;
    __u8  reserved;
}hobu;

typedef struct scsi_bus {
    __u16 code;           /* 0x08 */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  speed:4,
            res:1,
            ext:1,
           wide:1,
            dif:1;
    __u8 busnum;
}scbu;

typedef struct board_type {
    __u16 code;           /* 0x09 */
    __u8  flags;
    __u8  length;         /* 0x04 */
    __u8  unused:1,
             cmi:1,
             dmi:1,
            cm4k:1,
             cm4:1,
            dm4k:1,
             dm4:1,
             hba:1;
    __u8  cpu_type,
          cpu_speed;
    __u8    sx1:1,
            sx2:1,
        unused2:4,
           alrm:1,
           srom:1;
}boty;

typedef struct memory_config {
    __u16 code;           /* 0x0a */
    __u8  flags;
    __u8  length;         /* 0x04 */
    __u8  banksize[4];
}memco;

typedef struct firmware_info {
    __u16 code;           /* 0x0b */
    __u8  flags;
    __u8  length;         /* 0x04 */
    __u8  dnld:1,
         bs528:1,
           fmt:1,
         fw528:1;
    __u8  unused1,
          fw_type,
          unused;
}firm;

typedef struct subsystem_info {
    __u16 code;           /* 0x0c */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  shlf:1,
          swap:1,
          noss:1;
    __u8  reserved;
}subinf;

typedef struct per_channel_info {
    __u16 code;           /* 0x0d */
    __u8  flags;
    __u8  length;         /* 0x02 */
    __u8  channel;
    __u8  shlf:1,
          swap:1,
          noss:1,
           srs:1,
           que:1,
           ext:1,
          wide:1,
          diff:1;
}pcinf;

typedef struct array_limits {
    __u16 code;           /* 0x0e */
    __u8  flags;
    __u8  length;         /* 0x04 */
    __u8  max_groups,
          raid0_drv,
          raid35_drv,
          unused;
}arrlim;

/*
 * Overrides for Emacs so that we follow Linus's tabbing style.
 * Emacs will notice this stuff at the end of the file and automatically
 * adjust the settings for this buffer only.  This must remain at the end
 * of the file.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-indent-level: 4
 * c-brace-imaginary-offset: 0
 * c-brace-offset: -4
 * c-argdecl-indent: 4
 * c-label-offset: -4
 * c-continued-statement-offset: 4
 * c-continued-brace-offset: 0
 * indent-tabs-mode: nil
 * tab-width: 4
 * End:
 */

