/*++

Copyright (C) Microsoft Corporation, 1998 - 1999

Module Name:

    rbc.h

Abstract:

    These are the structures and defines used in the Reduced Block Command set

Authors:

    George Chrysanthakopoulos(georgioc) - April 1998

Revision History:

    Dan Knudson (DanKn), 23 Sep 1999 - updated per rev 10 of RBC spec

--*/
#ifndef _NTRBC_
#define _NTRBC_

#include "scsi.h"

//
// Command Descriptor Block. encapsulated under the bus/protocol specific request block
//

typedef union _CDB_RBC {

    //
    // format unit
    //
    
    struct _FORMAT_RBC {
        UCHAR OperationCode;
        UCHAR VendorSpecific;
        UCHAR Increment : 1;
        UCHAR Percent_Time : 1;
        UCHAR Reserved1 : 1;
        UCHAR VendorSpecific1 : 5;
        UCHAR Reserved2[2];
        UCHAR Control;
    } FORMAT_RBC, *PFORMAT_RBC;
    
    //
    // prevent/allow medium removal
    //

    struct _MEDIA_REMOVAL_RBC {
        UCHAR OperationCode;
        UCHAR Reserved[3];

        UCHAR Prevent : 1;
        UCHAR Persistant : 1;
        UCHAR Reserved3 : 6;

        UCHAR Control;
    } MEDIA_REMOVAL_RBC, *PMEDIA_REMOVAL_RBC;

    //
    // START_STOP_UNIT
    //

    struct _START_STOP_RBC {
        UCHAR OperationCode;
        UCHAR Immediate: 1;
        UCHAR Reserved1 : 7;
        UCHAR Reserved2[2];
        UCHAR Start : 1;
        UCHAR LoadEject : 1;
        UCHAR Reserved3 : 2;
        UCHAR PowerConditions : 4;
        UCHAR Control;
    } START_STOP_RBC, *PSTART_STOP_RBC;

    struct _SYNCHRONIZE_CACHE_RBC {

        UCHAR OperationCode;    // 0x35
        UCHAR Reserved[8];
        UCHAR Control;

    } SYNCHRONIZE_CACHE_RBC, *PSYNCHRONIZE_CACHE_RBC;


} CDB_RBC, *PCDB_RBC;


//
// START_STOP_UNIT Power Condition descriptions
//

#define START_STOP_RBC_POWER_CND_NO_CHANGE      0
#define START_STOP_RBC_POWER_CND_ACTIVE         1
#define START_STOP_RBC_POWER_CND_IDLE           2
#define START_STOP_RBC_POWER_CND_STANDBY        3
#define START_STOP_RBC_POWER_CND_SLEEP          5
#define START_STOP_RBC_POWER_CND_DEVICE_CTRL    7


//
// Mode Sense/Select page constants.
//

#define MODE_PAGE_RBC_DEVICE_PARAMETERS 0x06


//
// DeviceType field in inquiry Data
//

#define RBC_DEVICE             0x0E

//
// Define Device Capabilities page.
//

typedef struct _MODE_RBC_DEVICE_PARAMETERS_PAGE {
    UCHAR PageCode : 6;
    UCHAR Reserved : 1;
    UCHAR PageSavable : 1;
    UCHAR PageLength;
    UCHAR WriteCacheDisable : 1;
    UCHAR Reserved1 : 7;
    UCHAR LogicalBlockSize[2];
    UCHAR NumberOfLogicalBlocks[5];
    UCHAR PowerPerformance;
    UCHAR LockDisabled : 1;
    UCHAR FormatDisabled : 1;
    UCHAR WriteDisabled : 1;
    UCHAR ReadDisabled : 1;
    UCHAR Reserved2 : 4;
    UCHAR Reserved3;

}MODE_RBC_DEVICE_PARAMETERS_PAGE, *PMODE_RBC_DEVICE_PARAMETERS_PAGE;

typedef struct _MODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE {

    MODE_PARAMETER_HEADER Header;
    MODE_RBC_DEVICE_PARAMETERS_PAGE Page;

}MODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE,
    *PMODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE;


//
// unsolicited status sense code qualifier values
//

#define RBC_UNSOLICITED_STATUS              0x02
#define RBC_UNSOLICITED_SENSE_KEY           0x06

#define RBC_UNSOLICITED_SC_PWR_STATE_CHNG   0xFF
#define RBC_UNSOLICITED_SC_EVENT_STATUS     0xFE

#define RBC_UNSOLICITED_CLASS_ASQ_DEVICE    0x06
#define RBC_UNSOLICITED_CLASS_ASQ_MEDIA     0x04
#define RBC_UNSOLICITED_CLASS_ASQ_POWER     0x02




//
// Translation routine used to convert SCSI requests that differ from RBC
//

NTSTATUS
Rbc_Scsi_Conversion(
    IN PSCSI_REQUEST_BLOCK Srb,
    IN PSCSI_REQUEST_BLOCK *OriginalSrb,
    IN PMODE_RBC_DEVICE_PARAMETERS_HEADER_AND_PAGE RbcHeaderAndPage,
    IN BOOLEAN OutgoingRequest,
    IN BOOLEAN RemovableMedia
    );


#endif
