302 lines
8.8 KiB
C
302 lines
8.8 KiB
C
/*****************************************************************************
|
||
*
|
||
* 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;
|
||
}
|