NT4/private/ntos/dd/qic117/0x11023.c
2020-09-30 17:12:29 +02:00

302 lines
8.8 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************
*
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
* ALL RIGHTS RESERVED.
*
******************************************************************************
*
* FILE: \SE\DRIVER\DEVICE\JUMBO\SRC\0X11023.C
*
* FUNCTION: cqd_GetDeviceDescriptorInfo
*
* PURPOSE: Gets the following Drive information:
*
* 1) Drive Type/Model
* 2) Firmware Revision
* 3) Serial Number
* 4) Date of manufacture
* 5) OEM Field Flag
* 6) OEM Field
* 7) Country Code
*
* The OEM, Serial Number and the Date of manufacture are
* miscellaneous drive train information that is embedded
* in the drive's firmware.
*
* If the drive type is not CMS and/or the firmware revision
* is pre-80 then zeros are returned in these fields. The
* drive type is obtained by making a call to Rpt_Cms_dStatus.
* This has been done to support the Jumbo B platform.
*
* HISTORY:
* $Log: J:\se.vcs\driver\q117cd\src\0x11023.c $
*
* Rev 1.8 15 May 1995 10:47:08 GaryKiwi
* Phoenix merge from CBW95s
*
* Rev 1.7.1.0 11 Apr 1995 18:03:44 garykiwi
* PHOENIX pass #1
*
* Rev 1.9 30 Jan 1995 14:24:20 BOBLEHMA
* Changed the function name to cqd_CmdReportDeviceInfo. Changed code to
* use the new device_info data type. Changed all references to the
* device_descriptor.version to cqd_context->firmware_version.
*
* Rev 1.8 13 Jan 1995 16:28:22 BOBLEHMA
* Added oem strings for CMS, Conner and Iomega drives. CMS is done only if the
* firmware does not contain a string. Note that this is a temporary fix for
* CBW 2.5. Later versions will have the string handling in the user manager
* based on the vendor code sent from the driver.
*
* Rev 1.7 28 Mar 1994 08:01:36 CHETDOUG
* Clear out serial number, manufacturing date, and oem string
* for non CMS vendors. This prevents bogus data from being displayed
* when doing a drive status of an IOmega drive.
*
* Rev 1.6 09 Mar 1994 09:55:18 KEVINKES
* Modified to only get drive information if the information has
* not already been retrieved, and the vendor is CMS.
*
* Rev 1.5 11 Jan 1994 14:32:30 KEVINKES
* Added more thorough status checking.
*
* Rev 1.4 14 Dec 1993 14:19:30 CHETDOUG
* fixed serial number
*
* Rev 1.3 07 Dec 1993 16:18:26 CHETDOUG
* OEM string is before origin of manufacture in drive training table
*
* Rev 1.2 08 Nov 1993 14:03:54 KEVINKES
* Removed all bit-field structures, removed all enumerated types, changed
* all defines to uppercase, and removed all signed data types wherever
* possible.
*
* Rev 1.1 25 Oct 1993 14:37:16 KEVINKES
* Changed kdi_wt2ticks to kdi_wt004ms.
*
* Rev 1.0 18 Oct 1993 17:23:30 KEVINKES
* Initial Revision.
*
*****************************************************************************/
#define FCT_ID 0x11023
#include "include\public\adi_api.h"
#include "include\public\frb_api.h"
#include "include\public\vendor.h"
#include "include\private\kdi_pub.h"
#include "include\private\cqd_pub.h"
#include "q117cd\include\cqd_defs.h"
#include "q117cd\include\cqd_strc.h"
#include "q117cd\include\cqd_hdr.h"
/*endinclude*/
dStatus cqd_CmdReportDeviceInfo
(
/* INPUT PARAMETERS: */
CqdContextPtr cqd_context,
DeviceInfoPtr device_info
/* UPDATE PARAMETERS: */
/* OUTPUT PARAMETERS: */
)
/* COMMENTS: *****************************************************************
*
* DEFINITIONS: *************************************************************/
{
/* DATA: ********************************************************************/
dStatus status=DONT_PANIC; /* dStatus or error condition.*/
dUByte bit_bucket;
dUWord i;
dUByte man_date[MAN_DATE_LENGTH];
union {
dUDWord serial_number;
dUByte serial_str[SERIAL_NUM_LENGTH];
} u_serial;
/* CODE: ********************************************************************/
/*
* Set the device info fields take we know about and initialize
* the others to null before attempting to read the data from
* the drive.
*/
device_info->drive_class = cqd_context->device_descriptor.drive_class;
device_info->vendor = cqd_context->device_descriptor.vendor;
device_info->model = cqd_context->device_descriptor.model;
device_info->version = cqd_context->firmware_version;
device_info->serial_number = 0l;
device_info->manufacture_date = 0;
device_info->oem_string[0] = '\0';
device_info->country_code[0] = '\0';
if (cqd_context->device_descriptor.vendor == VENDOR_CMS &&
cqd_context->firmware_version >= FIRM_VERSION_80) {
status = cqd_SetDeviceMode(cqd_context, DIAGNOSTIC_1_MODE);
/* Send the Get Drive Training Information Command to the Drive. */
if (status == DONT_PANIC) {
status = cqd_SendByte(cqd_context, FW_CMD_DTRAIN_INFO);
}
kdi_Sleep(cqd_context->kdi_context, INTERVAL_CMD, dFALSE);
/* Send the Get Descriptive Info Command to the Drive. */
if (status == DONT_PANIC) {
status = cqd_SendByte(cqd_context, FW_CMD_GDESP_INFO);
}
kdi_Sleep(cqd_context->kdi_context, INTERVAL_CMD, dFALSE);
/* Get the Drive Type and throw it in the bit_bucket -- */
/* just to keep the data in sync. */
if (status == DONT_PANIC) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&bit_bucket,
READ_BYTE,
dNULL_PTR);
}
if (cqd_context->firmware_version >= FIRM_VERSION_110) {
/*
* Get the Drive Class and throw it in the bit_bucket --
* just to keep the data in sync.
*/
if (status == DONT_PANIC) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&bit_bucket,
READ_BYTE,
dNULL_PTR);
}
/*
* Get the Head Type and throw it in the bit_bucket --
* just to keep the data in sync.
*/
if (status == DONT_PANIC) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&bit_bucket,
READ_BYTE,
dNULL_PTR);
}
}
/* Get the Serial Number from the drive and store it in */
/* device_info->serial_number */
for (i=SERIAL_NUM_LENGTH; (i > 0) && (status == DONT_PANIC); --i) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&u_serial.serial_str[i-1],
READ_BYTE,
dNULL_PTR);
}
device_info->serial_number = u_serial.serial_number;
/* Get the Manufacturing date from the drive and store it in */
/* device_info->manufacture_date */
for (i=0; (i < MAN_DATE_LENGTH) && (status == DONT_PANIC); ++i) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&man_date[i],
READ_BYTE,
dNULL_PTR);
}
device_info->manufacture_date = (dUByte)man_date[0];
device_info->manufacture_date <<= 8;
device_info->manufacture_date |= (dUByte)man_date[1];
/* Get the OEM field from the drive and store it in */
/* device_info->oem_string[] */
for (i=0; (i < OEM_LENGTH) && (status == DONT_PANIC); ++i) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&device_info->oem_string[i],
READ_BYTE,
dNULL_PTR);
}
device_info->oem_string[OEM_LENGTH-1] = '\0'; /* force a string termination */
if (cqd_context->firmware_version >= FIRM_VERSION_110) {
/*
* Get the Place of Origin Code and throw it in the bit_bucket --
* just to keep the data in sync.
*/
for (i=0; (i < PLACE_OF_ORIGIN_LENGTH) && (status == DONT_PANIC); ++i) {
status = cqd_Report(
cqd_context,
FW_CMD_READ_RAM,
(dUWord *)&device_info->country_code[i],
READ_BYTE,
dNULL_PTR);
}
}
if (status == DONT_PANIC) {
status = cqd_SetDeviceMode(cqd_context, PRIMARY_MODE);
}
}
if (status != DONT_PANIC && kdi_GetErrorType( status ) != ERR_NO_TAPE) {
/*
* An error other than No Tape is being returned. Zero out any
* fields that may have been filled in.
*/
device_info->serial_number = 0l;
device_info->manufacture_date = 0;
device_info->oem_string[0] = '\0';
device_info->country_code[0] = '\0';
}
return status;
}