

/*
 *      ( CDB ) group_0 command format
 */
typedef struct scsi_cdb0 {
        u_char  cmd;                    /* [0x0] command code           */
        u_char  lun         : 3;        /* [0x1] logical unit number    */
        u_char  blk_addr_h  : 5;        /*       high address           */
        u_char  blk_addr_m;             /* [0x2] middle address         */
        u_char  blk_addr_l;             /* [0x3] low address            */
        u_char  data_len;               /* [0x4] data count (block)     */
        u_char  vendor_uniq : 2;        /* [0x5] vendor uniq            */
        u_char  reserve     : 4;        /*       reserved               */
        u_char  flag        : 1;        /*       flag request           */
        u_char  link        : 1;        /*       link flag              */
} scsi_cdb0_s;

/*
 *      Block Descriptor
 */
typedef struct scsi_blkdesc {
        u_char  density;                /* Block Descriptor Density     */
        u_char  blk_cnt_h;              /* Number Of Blocks ( MSB )     */
        u_char  blk_cnt_m;              /* Number Of Blocks             */
        u_char  blk_cnt_l;              /* Number Of Blocks ( LSB )     */
        u_char  reserve;                /* Reserved                     */
        u_char  blk_len_h;              /* Block Length ( MSB )         */
        u_char  blk_len_m;              /* Block Length                 */
        u_char  blk_len_l;              /* Block Length ( LSB )         */
} scsi_blkdesc_s;

/*
 *      Mode Select Parameters
 */
struct scsi_msel {
        u_char  reserve1  : 8;          /* Reserved                     */
        u_char  mtype;                  /* Medium Type                  */
        u_char  reserve2  : 8;          /* Reserved                     */
        u_char  bd_len;                 /* Block Descriptor Length      */
        scsi_blkdesc_s scsi_blkdesc;    /* Block Descriptor             */
};

/*
 * Diese Funktion setzt die Blocklänge des CD-ROM-Laufwerks auf 512
 * Byte.  Sie benutzt die Funktion xqtscsicmd zur Ausführung eines
 * SCSI-Kommandos und die Funktion cmn_err zur Ausgabe einer
 * Konsolmeldung im Fehlerfall.
 * Parameter:
 *      dev     major/minor device number
 * Return-Wert:
 *      0 bei Fehler, 1 bei Erfolg
 */
int cd_setblocksize(dev_t dev)
{
    static scsi_cdb0_s msel_cdb = {
        15h,                            /* MODE SELECT (6) */
        0,                              /* LUN */
        10h,                            /* PF-Bit gesetzt: SCSI-2 */
        0, 0,                           /* reserviert */
        sizeof(struct scsi_msel),       /* Länge Parameterblock */
        0, 0, 0, 0                      /* reserviert */
    };
    static struct scsi_msel msel_data = {
        0, 0, 0,                        /* reserviert */
        sizeof(struct scsi_blkdesc), {  /* Block Descriptor Length */
            00h,                        /* Density Code */
            0, 0, 0,                    /* 0 = ganze Disk */
            0,                          /* reserviert */
            0, 2, 0                     /* Block Length: 512 */
        }
    };
    if (xqtscsicmd(dev,
                   (char *) &msel_cdb, sizeof(msel_cdb),
                   B_WRITE,
                   (char *) &msel_data, sizeof(msel_data))
        < 0) {
        cmn_err(CE_WARN, "cdr(%d,%d): mode select failed.\n",
                major(dev), minor(dev));
        return 0;
    }
    return 1;
}

:fl
