The Linux SCSI programming HOWTO
Heiko Eissfeldt
[email protected]
v1.5, 7 May 1996
II Ryouta(��� ����)
[email protected]
�a�� 5 March 1998
���̕����� Linux �̔ėp SCSI �C���^�[�t�F�[�X�̃v���O���~���O��戵��
�܂��B
______________________________________________________________________
�ڎ�
1. �ŐV���
2. ���_
3. �ėp SCSI �C���^�[�t�F�[�X�Ƃ́H
4. �g�p�ɂ������ĕK�v�Ȃ�̂́H
4.1 �J�[�l���̃R���t�B�M�����[�V����
4.2 �f�o�C�X�t�@�C��
4.3 �f�o�C�X�̑Ή��t��
4.3.1 SCSI ���u�̓��I�ȑ}���ƍ폜
5. �v���O���}�̂��߂̃K�C�h
6. �f�o�C�X�v���O���~���O�̊T�v
7. �f�o�C�X��I�[�v������
8. �w�b�_�\����
9. Inquiry[�Ɖ�]�R�}���h�̗�
10. �Z���X�o�b�t�@
11. �Z���X�o�b�t�@��p�����
12. ioctl ��
13. �h���C�o�̃f�t�H���g
13.1 Transfer Lengths �`�B��
13.2 �^�C���A�E�g�y�эĎ��s�̒l
14. SCSI �̎d�l�̎擾
15. �֘A���
15.1 HOWTOs and FAQs HOWTO �� FAQ
15.2 ���[�����O���X�g
15.3 �R�[�h��
16. ���ɖ�ɗ����
16.1 �f�o�C�X�h���C�o����l�̏����ɂȂ���
16.2 ���[�e�B���e�B
17. SCSI �ɃA�N�Z�X���邻�̑��̃C���^�[�t�F�[�X
18. ������
19. �ӎ�
20. �t�^
21. �G���[����
21.1 �G���[�X�e�[�^�X�̉��
21.2 �X�e�[�^�X�R�[�h
21.3 SCSI Sense Keys
21.4 Host codes
21.5 Driver codes
22. Additional sense codes ����� additional sense code qualifiers
22.1 ASC and ASCQ(������)
22.2 ASC and ASCQ(�ԍ���)
23. SCSI�R�}���h�R�[�h�̃N�C�b�N���t�@�����X
24. �v���O������
______________________________________________________________________
1. �ŐV���
�V�����J�[�l���ł̓C���^�[�t�F�[�X�������ς��܂����B����͈ȑO�Ɂu�f
�o�C�X�̍ăX�L�����v�Ƒ肵�Ă����͂ɉe��������܂��B���ł� SCSI �@���
�V�X�e���ғ����ɒlj�/�폜���邱�Ƃ��\�ł��B
�J�[�l�� 1.3.98 �ȍ~�A�������̏d�v�ȃw�b�_�t�@�C�����ړ�/���������
���� (sg.h �� scsi.h)�B
�����ȃo�O�̂Ȃ��ɂ͐V������̂Ɏ�芷����ꂽ��̂���܂��B
2. ���_
���̕����� Linux �̔ėp SCSI �C���^�[�t�F�[�X�̓����ƃv���O���~���O��
���߂̎����ł��B
���̕����̓J�[�l���ł̕K�v��A���u�Ƃ̑Ή��A����ё��u�Ԃ̊�{�I�ȑ�
�ݍ�p��J�o�[���܂��B�������̒P���� C �v���O���~���O�̗��܂܂��
���BSCSI �R�}���h�Z�b�g�ɂ��Ă̈�ʓI�Ȓm�����K�v�ł��GSCSI �W���K�i
�Ɗ֘A���Ɋւ���ڂ������ɂ��ẮA���̕����̕t�^��Q�Ƃ��Ă�����
���B
���̕����̃v���[���e�L�X�g�̃o�[�W�����ł́A���ݎQ��(``''�Ŏ�����܂�)
���������Ă��邱�Ƃɒ��ӂ��Ă��������B
3. �ėp SCSI �C���^�[�t�F�[�X�Ƃ́H
�ėp(generic) SCSI �C���^�[�t�F�[�X�� SCSI �n�[�h�E�F�A��(�Ђ��Ƃ���
��G�L�]�`�b�N��)���i�ւ̈�ʓI�� SCSI �̃A�N�Z�X����邽�߂Ɏ���
����܂����BLawrence Foard (
[email protected]) �ɂ��ĊJ������A
Killy Corporation (scsi/sg.h�ɂ���R�����g��Q�Ƃ��Ă�������) �ɂ���
�㉇����܂����B
���̃C���^�[�t�F�[�X�̓��[�U���x���̃A�v���P�[�V����(���Ȃ킿�A�J�[�l
���̊O��)�����ʂȋ@�푀���\�ɂ��܂��B������A�J�[�l���h���C�o��
�J���́A���댯�Ńf�o�b�O����Ȃ�̂Ȃ̂ł����A�K�v����܂���B
�Ƃ͂����A�K�Ƀh���C�o��쓮�����Ȃ��ƁASCSI �o�X��h���C�o���邢��
�J�[�l����n���O����\��������܂��B�ł�����A�ėp�h���C�o�𐳂�����
�������邱�ƂƁA�f�[�^�̑r�����邽�߂ɍŏ��ɑS�Ẵt�@�C����o�b�N
�A�b�v���邱�Ƃ���ł��B���ɂ��Ȃ��̃v���O�����𑖂点��O�ɂ��Ă�
���Ɩ�ɗ����Ƃ�����܂��B�S�Ẵo�b�t�@���f�B�X�N�Ƀt���b�V�������
���Ƃ�m���ɂ��邽�߂� sync �R�}���h�s���邱�ƂŁA���V�X�e�����n
���O���Ă�f�[�^���X�͍ŏ��ɂȂ�܂��B
�ėp�h���C�o�̂���̗��_�Ƃ��ẮA�C���^�[�t�F�[�X���g���ω����Ȃ�
����A�S�ẴA�v���P�[�V�����͐V�����J�[�l���̊J������Ɨ����Ă�����
���Ƃł��B��r����Ȃ�A���̒�x���ȃJ�[�l���h���C�o�͑��̃J�[�l��
���̕ω��ƕ���킳�Ȃ���Ȃ�܂���B
�T�^�I�ɂ́A�ėp�h���C�o�͂Ƃ��̋@�\�̒����������߂ɓ���ȃ��[�U�A
�v���P�[�V�������������K�v�̂���V���� SCSI �n�[�h�E�F�A���u(��: �X
�L���i�[�A�v�����^�ACD-ROM �W���[�N�{�b�N�X)�ƒʐM���邽�߂Ɏg�p�����
���B�ėp�C���^�[�t�F�[�X�ɂ��Ă����̃A�v���P�[�V������v���ɍ�邱
�Ƃ��ł��܂��B
4. �g�p�ɂ������ĕK�v�Ȃ�̂́H
4.1. �J�[�l���̃R���t�B�M�����[�V����
���Ȃ��� Linux �ɂ��ăT�|�[�g����Ă��� SCSI �R���g���[������Ă�
�Ȃ���Ȃ�Ȃ��͖̂��炩�ł��B�����āA���Ȃ��̃J�[�l���ɔėp SCSI �T
�|�[�g�����łȂ��R���g���[���̃T�|�[�g��g���܂˂Ȃ�܂���B Linux
�J�[�l����(/usr/src/linux �ł� make config �ɂ��)�R���t�B�M�����[�V��
���͓T�^�I�ɂ͎��̂悤�ɂȂ�܂��B
...
*
* SCSI support
*
SCSI support? (CONFIG_SCSI) [n] y
*
* SCSI support type (disk, tape, CDrom)
*
...
Scsi generic support (CONFIG_CHR_DEV_SG) [n] y
*
* SCSI low-level drivers
*
...
�����p�ł���Ȃ�A����Ƀ��W���[����쐬���Ă��܂��܂���B [��
��]
make menuconfig
4.2. �f�o�C�X�t�@�C��
�ėp SCSI �h���C�o�́A���� SCSI �f�o�C�X�h���C�o�ɂ��ėp��������
�Ƃ͕ʂ́A�ŗL�̃f�o�C�X�t�@�C����g�p���܂��B�����̃f�o�C�X�t�@�C��
�́A�ʏ�� /dev�f�B���N�g���ɂ���AMAKEDEV �X�N���v�g�ɂ��Đ�������
���Ƃ��ł��܂��BMAKEDEV sg�𑖂点��ƈȉ��̃t�@�C�����쐬����܂��F
crw------- 1 root system 21, 0 Aug 20 20:09 /dev/sga
crw------- 1 root system 21, 1 Aug 20 20:09 /dev/sgb
crw------- 1 root system 21, 2 Aug 20 20:09 /dev/sgc
crw------- 1 root system 21, 3 Aug 20 20:09 /dev/sgd
crw------- 1 root system 21, 4 Aug 20 20:09 /dev/sge
crw------- 1 root system 21, 5 Aug 20 20:09 /dev/sgf
crw------- 1 root system 21, 6 Aug 20 20:09 /dev/sgg
crw------- 1 root system 21, 7 Aug 20 20:09 /dev/sgh
| |
major, minor device numbers
���W���[, �}�C�i�[ �f�o�C�X�ԍ�
�����͒��ɃA�N�Z�X���邽�߂ɃL�����N�^�f�o�C�X�ł��邱�Ƃɒ��ӂ��Ă�
�������B�V�X�e���ɂ��Ă͂����̃f�o�C�X�� /dev/{sg0, sg1,...} �ƌ�
��Ă��邩����܂��A�C���X�g�[���������(��
��:Slackware,RedHat,Debian�Ȃǂ̃p�b�P�[�W)�Ɉˑ����܂��̂ŁA�ȉ��̗�
�͓K���ɓǂ݊����Ă��������B
4.3. �f�o�C�X�̑Ή��t��
�����̃f�o�C�X�t�@�C���� SCSI �o�X��� SCSI ID/LUN �ɑ��ē��I�ɑ�
���t�����܂�(LUN = ���W�J�����j�b�g)�B���̑Ή��t���ł͒�ʂ� LUN/ID/
�o�X ����n�܂��āASCSI �̃X�L�����̎��_�ɂ݂���ꂽ�e SCSI �o�X���
�e���u�̊e LUN �ɑ��ĘA���I�Ƀf�o�C�X(�t�@�C���̃}�C�i�[�ԍ�)������
�Ă��܂��B����͍ŏ��� SCSI �R���g���[������n�܂�A�S�Ă̈ȍ~�̃R��
�g���[���ɂ��Ē��f����Ȃ�����p�����܂��B����͌��݂̂Ƃ��� SCSI �h
���C�o�̏������ɂ����ĂȂ���܂��B
�Ⴆ�A�O�� SCSI ���u���ŏ��� SCSI �o�X��� ID 1,3,5 �ɂȂ����Ă�
��Ƃ��܂��傤(���ꂼ�ꂪ���LUN����Ă��܂�)�B����ƁA���ʂƂ���
�ȉ��̂悤�ȑΉ��t�����Ȃ����ł��傤�F
/dev/sga -> SCSI id 1
/dev/sgb -> SCSI id 3
/dev/sgc -> SCSI id 5
���V�������u�� ID 4 �Œlj������Ȃ�A(����̍ăX�L�������)�Ή��t��
�́F
/dev/sga -> SCSI id 1
/dev/sgb -> SCSI id 3
/dev/sgc -> SCSI id 4
/dev/sgd -> SCSI id 5
�ƂȂ�܂��B
ID 5 �Ɋւ���ω��ɒ��ӂ��܂��傤�B�Ή�����f�o�C�X(�t�@�C��)�͂�͂�
/dev/sgc�ł͂Ȃ��āA����/dev/sgd�̉��ɑΉ��������Ă��܂��B
�K���ɂ�A�V�����J�[�l���ł͏��Ԃ�ύX���邱�Ƃ��ł��܂��B
4.3.1. SCSI ���u�̓��I�ȑ}���ƍ폜
�V�����J�[�l����/proc�t�@�C���V�X�e���������Ă���Ȃ�A�g�p����Ă�
�Ȃ����u��V�X�e���ғ����Ɏ��O�����蓱�����邱�Ƃ��ł��܂��B
SCSI ���u����O���ɂ́F
echo "scsi remove-single-device a b c d" > /proc/scsi/scsi
���l�ɂ��āASCSI ���u��lj�����ɂ́A
echo "scsi add-single-device a b c d" > /proc/scsi/scsi
�Ƃ��܂��B
������
a == �z�X�g�A�_�v�^�̔ԍ� (�ŏ��̂�̂� 0)
b == �z�X�g�A�_�v�^��� SCSI �`���l�� (�ŏ��̂�̂� 0)
c == ID
d == LUN (�ŏ��̂�̂� 0)
�ł�����O�q�̗�ɂ����� /dev/sgc �� /dev/sgd �̑Ή��t�����ւ��邽
�߂ɂ́A���̂悤�ɂ���ł���ł��傤�B [�Fcat /proc/scsi/scsi��
���s����A������4�̒l�ɂȂɂ�ݒ肷������������߂�Ǝv����
���B]
echo "scsi remove-single-device 0 0 4 0" > /proc/scsi/scsi
echo "scsi remove-single-device 0 0 5 0" > /proc/scsi/scsi
echo "scsi add-single-device 0 0 5 0" > /proc/scsi/scsi
echo "scsi add-single-device 0 0 4 0" > /proc/scsi/scsi
�Ȃ��Ȃ�A�ėp�f�o�C�X�͂���炪�}�����ꂽ���ԂőΉ��t�����邩���
���B
����ɑ��u�� SCSI �o�X�ɒlj�����Ƃ��́A�V�������u�ɂ͓o�^�ł���\����
�����Ă��邱�Ƃ�S�ɗ��߂Ă����܂��傤�B���̃������̓u�[�g���Ɋ�����
���A��̑��u����邽�߂̗]�n������܂��B
[��]initrd�@�\�Ƒg�ݍ��킹�邱�Ƃɂ��A���̎d�g�݂�p���ċ@��\����
�ω��ɑ��_��ȃV�X�e����\�z���邱�Ƃ��ł���ł��傤�B
5. �v���O���}�̂��߂̃K�C�h
�ȉ��͔̏͂ėp SCSI �C���^�[�t�F�[�X����̃A�v���P�[�V�����̂��߂Ɏg
�p�������Ƃ����v���O���}�̂��߂̂�̂ł��B���p���āASCSI ���u��
INQUIRY �� TESTUNITREADY �R�}���h�ɂ��ăA�N�Z�X����ɂ͂ǂ������
��������܂��B
�����̃R�[�h���g�p����ۂ́A�ȉ��̂��Ƃɒ��ӂ��Ă��������F
o �w�b�_�t�@�C��sg.h ����� scsi.h �̈ʒu�̓J�[�l���o�[�W���� 1.3.98
�ŕύX�ɂȂ�܂����B���ł͂����̃t�@�C����
/usr/src/linux/include/scsi�Ɉʒu���Ă��܂��B����
��/usr/include/scsi �ɑ��ă����N����Ă��邱�Ƃ����҂���܂��B��
�O�́A������ /usr/src/linux/drivers/scsi�ɂ���܂����B�e�L�X�g��
�ȉ��ł͐V�����J�[�l����z�肵�Ă��܂��B
o �ėp SCSI �C���^�[�t�F�[�X�̓J�[�l���o�[�W���� 1.1.68 �Ŋg�������
�����G�ȍ~�̗�ɂ͏��Ȃ��Ƃ��̃o�[�W�������K�v�ƂȂ�܂��B������
�J�[�l���o�[�W������1.1.77����1.1.89�܂ŁA����сA1.3.52��
��1.3.56�܂ŁA�͂ǂ�����Ă��������B�Ƃ����̂́A�����̃J�[�l��
�ł͔ėp SCSI �C���^�[�t�F�[�X���Œ��ꒃ������ł��B
o �A�N�Z�X�����f�o�C�X��\������w�b�_�����̒萔 DEVICE �͂��Ȃ���
���p�ł���f�o�C�X�ɏ]������̂łȂ��Ă͂Ȃ�܂���(``''�͂�Q�Ƃ���
��������)�B
6. �f�o�C�X�v���O���~���O�̊T�v
�w�b�_�t�@�C�� include/scsi/sg.h �̓C���^�[�t�F�[�X�̋L�q��܂�ł���
��(�J�[�l���o�[�W���� 1.3.98 �Ɋ�Â��Ă��܂�)�F
struct sg_header
{
int pack_len; /* ������p�P�b�g�� (�w�b�_����) */
int reply_len; /* ���҂���鉞���̍ő咷 */
int pack_id; /* �p�P�b�g�� id �i���o�[ */
int result; /* 0==ok, ����ȊO�� errno �R�[�h��w�� */
unsigned int twelve_byte:1;
/* �O���[�v 6 & 7 �R�}���h�ɑ� 12 �o�C�g�R�}���h����� */
unsigned int other_flags:31; /* �����p */
unsigned char sense_buffer[16]; /* read �ɂ��Ă̂ݎg�p����� */
/* �R�}���h�ɑ����ăR�}���h�̂��߂̃f�[�^(?) */
};
���̍\���̂͂ǂ̂悤�� SCSI �R�}���h����������A�܂��A�R�}���h�̎��s��
�ʂ�ێ������Ԃ���Ă��邩��\���Ă��܂��B�X�̍\���̂̍\���v�f��
���Ă�``''�͂Ō�ɋc�_���܂��B
�ėp�f�o�C�X�ƃf�[�^������ʏ�̕��@�͈ȉ��̂悤�ɂȂ�܂��F�I�[�v
�������ėp�f�o�C�X�ɑ��R�}���h�𑗂邽�߂Ɏ��̎O�̕�����܂ރu���b
�N��f�o�C�X�ɑ��� write() ���܂��B
struct sg_header
SCSI �R�}���h
�R�}���h�ƈꏏ�ɑ�����ׂ��f�[�^
�R�}���h�̌��ʂ�l������ɂ́A����(�Ɠ��l��)�u���b�N�\���̂�p���ău
���b�N�� read() ���܂��B
struct sg_header
�f�o�C�X��������f�[�^
���ꂪ�����ߒ��̒ʏ�̊T�v�ł��B�ȍ~�̏͂Ŋe�X�e�b�v����Əڂ����L�q
���܂��B
���ӁF�ŋ߂̃J�[�l���o�[�W�����Ɏ���܂ŁASIGINT �V�O�i���� write()��
�Ή�����read()�̌Ăяo���̊ԂŃu���b�N����K�v������܂���(�܂�
sigprocmask() �ɂ���)�Bwrite() �����猋�ʂ���Ă��邽�߂� read()
�Ȃ��ŕ��A���邱�Ƃ͑����ċN����A�N�Z�X��u���b�N���邱�ƂɂȂ�܂��B
���̃V�O�i���̃u���b�N�͌��{�̃R�[�h�ɂ͊܂܂�Ă��܂���B�ł����炱��
��̌��{�𑖂点��ۂɂ� SIGINT (a la ���Ȃ�^C )�s����ׂ��ł�
����܂���B
7. �f�o�C�X��I�[�v������
�ėp�f�o�C�X�� read ����� write �A�N�Z�X�ŃI�[�v�������K�v�������
���F
int fd = open (device_name, O_RDWR);
(�����CD-ROM�h���C�u�̂悤�ȓǂݏo����p�̃n�[�h�E�F�A���u�ɑ��Ă�
���Ă͂܂�܂�)�B
�R�}���h�𑗏o����ɂ�write��A�Ȃ�炩�̌��ʂ�ɂ�read��s����
����Ȃ�܂���B�G���[�̏ꍇ�ɂ͕Ԃ�l�͕��ł�(���S�ȃ��X�g��``''��
��Q�Ƃ��Ă�������)�B
8. �w�b�_�\����
�w�b�_�\���� struct sg_header �̓A�v���P�[�V�����ƃJ�[�l���h���C�o�̊�
�̒����w��Ƃ߂܂��B�ł͍\���v�f�ɂ��ďڂ����_���邱�Ƃɂ��܂���
���B
int pack_len
�̓h���C�o�ɏ������u���b�N�̃T�C�Y���`���܂��B����̓J�[�l��
�ɂ����ē��ł̎g�p�̂��߂ɒ�`����܂��B
int reply_len
�͉����Ŏ����u���b�N�̃T�C�Y���`���܂��B����̓A�v���P
�[�V�����̑������`����܂��B
int pack_id
���̃t�B�[���h�͗v���ɑ������Ă�̂ɖ𗧂��܂��B�A�v��
�P�[�V�����͊e�v���ɑ��Ĉ�ӂ�id��^���邱�Ƃ��ł��܂��B����
�R�}���h(�Ⴆ�� 4��)���̃f�o�C�X�� write �����Ƃ��܂��傤�B
�����̃R�}���h�͕���ɓ��삵�A�ǂꂩ����ł����ł��傤�B
4��� read �ɂ��ĉ���ہA�͗v�������ʂ菇�Ԃł�
��K�v�͂���܂���B�^�����v���ɑ��鐳������肷�邽�߂�
pack_id �t�B�[���h��g�p���邱�Ƃ��ł��܂��B�T�^�I�ɂ͂��̒l�͊e
�v�����Ƃɉ�������܂�(�����Ă��ɂ͈����܂�)�B����̗v����
�ő�ʂ̓J�[�l���ɂ��� SG_MAX_QUEUE (�Ⴆ�� 4)�ɐ�������Ă���
���B
int result
read ���邢�� write �Ăяo���̌��ʃR�[�h�B�����(���܂�)�ėp�h��
�C�o(�J�[�l��)�������`����܂��B write ��ďo���O�ɂ� NULL ��
���Ă����̂����S�ł��B�����̃R�[�h�� errno.h �ɂ����Ē�`����
�Ă��܂�(0 �̓G���[�Ȃ���Ӗ�)�B
unsigned int twelve_byte:1
���̃t�B�[���h�͔�W���̃x���_�ŗL�̃R�}���h��g�p���鎞�ɂ����K
�v�ł� (0xf0 - 0xff �͈̔�)�B�����̃R�}���h�̃R�}���h���� 10
�ł͂Ȃ� 12 �̂Ƃ��́A���̃t�B�[���h�� write �̌Ăяo���̑O�� 1
�ɃZ�b�g����˂Ȃ�܂���B����ȊO�R�}���h���̓T�|�[�g����Ă�
�܂���B����̓A�v���P�[�V�����������`����܂��B
unsigned char sense_buffer[16]
���̃o�b�t�@�̓R�}���h������������(read() �̌Ăяo���̌�)�ŃZ�b
�g���� SCSI �̃Z���X�R�[�h��܂�ł��܂��B�R�}���h�̌��ʂɂ���
�͂�������ǂݏo���˂Ȃ�Ȃ���̂���܂�(�Ⴆ��
TESTUNITREADY)�B�ʏ�� 0 �o�C�g��������܂���B���̃t�B�[���h��
�l�͔ėp�h���C�o (�J�[�l��)������Z�b�g����܂��B
���̌��{�̊��͒��ڔėp�J�[�l���h���C�o�ɍ�p���܂��B�w�b�_�\���̂��
�`���A write ��p���ăR�}���h�𑗏o���Aread �ɂ��Č��ʂ���A��
����(����ꂽ)�G���[�`�F�b�N��s���܂��B�Z���X�o�b�t�@�f�[�^�͏o�̓o�b
�t�@�̒��Ŏ�ɓ���邱�Ƃ��ł��܂�(�k���|�C���^���^�����Ă��Ȃ���
��A���̏ꍇ�͓��̓o�b�t�@��ɂ���܂�)�B�����ȉ��̗�̒��ŗp���邱
�Ƃɂ��܂��B
���ӁFDEVICE�̒l��Ȃ��̃f�o�C�X��L�q�����̂ɐݒ肵�Ă��������B
#define DEVICE "/dev/sgc"
/* �ėp SCSI �C���^�[�t�F�[�X��ۂɓ������Ă݂錩�{�v���O���� */
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <scsi/sg.h>
#define SCSI_OFF sizeof(struct sg_header)
static unsigned char cmd[SCSI_OFF + 18]; /* SCSI �R�}���h �o�b�t�@ */
int fd; /* SCSI �f�o�C�X/�t�@�C�� �f�B�X�N���v�^ */
/* �������� SCSI �R�}���h����B �ėp SCSI �C���^�[�t�F�[�X��g�p */
static int handle_SCSI_cmd(unsigned cmd_len, /* �R�}���h�� */
unsigned in_size, /* ���̓f�[�^�T�C�Y */
unsigned char *i_buff, /* ���̓o�b�t�@ */
unsigned out_size, /* �o�̓f�[�^�T�C�Y */
unsigned char *o_buff /* �o�̓o�b�t�@ */
)
{
int status = 0;
struct sg_header *sg_hd;
/* ���S������ */
if (!cmd_len) return -1; /* cmd_len != 0 ���K�v */
if (!i_buff) return -1; /* ���̓o�b�t�@�� NULL �łȂ����� */
#ifdef SG_BIG_BUFF
if (SCSI_OFF + cmd_len + in_size > SG_BIG_BUFF) return -1;
if (SCSI_OFF + out_size > SG_BIG_BUFF) return -1;
#else
if (SCSI_OFF + cmd_len + in_size > 4096) return -1;
if (SCSI_OFF + out_size > 4096) return -1;
#endif
if (!o_buff) out_size = 0; /* �o�̓o�b�t�@�Ȃ��A�o�̓T�C�Y�Ȃ� */
/* �ėp SCSI �f�o�C�X�w�b�_�̍\�z */
sg_hd = (struct sg_header *) i_buff;
sg_hd->reply_len = SCSI_OFF + out_size;
sg_hd->twelve_byte = cmd_len == 12;
sg_hd->result = 0;
#if 0
sg_hd->pack_len = SCSI_OFF + cmd_len + in_size; /* �s�v */
sg_hd->pack_id; /* ���g�p */
sg_hd->other_flags; /* ���g�p */
#endif
/* �R�}���h���o */
status = write( fd, i_buff, SCSI_OFF + cmd_len + in_size );
if ( status < 0 || status != SCSI_OFF + cmd_len + in_size ||
sg_hd->result ) {
/* �Ȃ�炩�̃G���[������ */
fprintf( stderr, "write(generic) result = 0x%x cmd = 0x%x\n",
sg_hd->result, i_buff[SCSI_OFF] );
perror("");
return status;
}
if (!o_buff) o_buff = i_buff; /* �o�b�t�@�̃|�C���^��`�F�b�N */
/* ���ʂ�� */
status = read( fd, o_buff, SCSI_OFF + out_size);
if ( status < 0 || status != SCSI_OFF + out_size || sg_hd->result ) {
/* �Ȃ�炩�̃G���[������ */
fprintf( stderr, "read(generic) status = 0x%x, result = 0x%x, "
"cmd = 0x%x\n",
status, sg_hd->result, o_buff[SCSI_OFF] );
fprintf( stderr, "read(generic) sense "
"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
sg_hd->sense_buffer[0], sg_hd->sense_buffer[1],
sg_hd->sense_buffer[2], sg_hd->sense_buffer[3],
sg_hd->sense_buffer[4], sg_hd->sense_buffer[5],
sg_hd->sense_buffer[6], sg_hd->sense_buffer[7],
sg_hd->sense_buffer[8], sg_hd->sense_buffer[9],
sg_hd->sense_buffer[10], sg_hd->sense_buffer[11],
sg_hd->sense_buffer[12], sg_hd->sense_buffer[13],
sg_hd->sense_buffer[14], sg_hd->sense_buffer[15]);
if (status < 0)
perror("");
}
/* ���ׂ���̂�������ǂ�����݂� */
if (status == SCSI_OFF + out_size) status = 0; /* �S������� */
return status; /* 0 �̓G���[�Ȃ���Ӗ� */
}
����͍ŏ��͂����Ԃ��G�ɂ݂��邩����܂��A�R�[�h�̂قƂ�ǂ�
�G���[�̃`�F�b�N�ƕł�(����̓R�[�h�����삷��悤�ɂȂ������Ƃł�
��ɗ����܂�)�B
Handle_SCSI_cmd �͑S�Ă� SCSI �R�}���h�̎�ނɑ��Ă̈�ʓI�Ȍ`����
���Ă��āA�ȉ��̂悤�ɕ��ނ���܂��F
�f�[�^���[�h | �R�}���h�̗�
===============================================
���́E�o�̓f�[�^�Ƃ�ɂȂ� | test unit ready
���̓f�[�^�Ȃ��A�o�̓f�[�^����| inquiry, read
���̓f�[�^����A�o�̓f�[�^�Ȃ�| mode select, write
���́E�o�̓f�[�^�Ƃ�ɂ��� | mode sense
9. Inquiry[�Ɖ�]�R�}���h�̗�
���Ƃ��{�I�� SCSI �R�}���h�̈�� INQUIRY �R�}���h�ŁA���u�̎��
�ƍ\���𖾂炩�ɂ��邽�߂Ɏg�p����܂��B�ȉ���SCSI-2 �d�l������̒�`
�ł�(�ڍׂ� SCSI-2 �W���K�i��Q�Ƃ̂���)�B
Table 44: INQUIRY Command
+=====-========-========-========-========-========-========-========-========+
| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|Byte | | | | | | | | |
|=====+=======================================================================|
| 0 | Operation Code (12h) |
|-----+-----------------------------------------------------------------------|
| 1 | Logical Unit Number | Reserved | EVPD |
|-----+-----------------------------------------------------------------------|
| 2 | Page Code |
|-----+-----------------------------------------------------------------------|
| 3 | Reserved |
|-----+-----------------------------------------------------------------------|
| 4 | Allocation Length |
|-----+-----------------------------------------------------------------------|
| 5 | Control |
+=============================================================================+
�o�̓f�[�^�͈ȉ��̒ʂ�F
Table 45: Standard INQUIRY Data Format
+=====-========-========-========-========-========-========-========-========+
| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|Byte | | | | | | | | |
|=====+==========================+============================================|
| 0 | Peripheral Qualifier | Peripheral Device Type |
|-----+-----------------------------------------------------------------------|
| 1 | RMB | Device-Type Modifier |
|-----+-----------------------------------------------------------------------|
| 2 | ISO Version | ECMA Version | ANSI-Approved Version |
|-----+-----------------+-----------------------------------------------------|
| 3 | AENC | TrmIOP | Reserved | Response Data Format |
|-----+-----------------------------------------------------------------------|
| 4 | Additional Length (n-4) |
|-----+-----------------------------------------------------------------------|
| 5 | Reserved |
|-----+-----------------------------------------------------------------------|
| 6 | Reserved |
|-----+-----------------------------------------------------------------------|
| 7 | RelAdr | WBus32 | WBus16 | Sync | Linked |Reserved| CmdQue | SftRe |
|-----+-----------------------------------------------------------------------|
| 8 | (MSB) |
|- - -+--- Vendor Identification ---|
| 15 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 16 | (MSB) |
|- - -+--- Product Identification ---|
| 31 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 32 | (MSB) |
|- - -+--- Product Revision Level ---|
| 35 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 36 | |
|- - -+--- Vendor Specific ---|
| 55 | |
|-----+-----------------------------------------------------------------------|
| 56 | |
|- - -+--- Reserved ---|
| 95 | |
|=====+=======================================================================|
| | Vendor-Specific Parameters |
|=====+=======================================================================|
| 96 | |
|- - -+--- Vendor Specific ---|
| n | |
+=============================================================================+
���̗�͒�x���� handle_SCSI_cmd �� Inquiry SCSI �R�}���h��s��
�邽�߂Ɏg�p���܂��B
�ŏ��ɋ��ʃw�b�_�ɃR�}���h����lj����A���ꂩ�� handle_SCSI_cmd ��Ă�
�o���܂��Bhandle_SCSI_cmd �̌Ăяo���ɑ���o�̓o�b�t�@�T�C�Y�̈�����
���ʃw�b�_�̃T�C�Y��O���Ă��邱�Ƃɒ��ӂ��Ă��������B�G���[��������
�Ȃ������Ȃ�A�R�}���h������������ɏo�̓o�b�t�@�͗v�����ꂽ�f�[�^��
�ۗL���邱�ƂɂȂ�܂��B
#define INQUIRY_CMD 0x12
#define INQUIRY_CMDLEN 6
#define INQUIRY_REPLY_LEN 96
#define INQUIRY_VENDOR 8 /* �ԓ��f�[�^��̃x���_���̃I�t�Z�b�g */
/* �x���_�̃u�����h�ƃ��f����v�� */
static unsigned char *Inquiry ( void )
{
static unsigned char Inqbuffer[ SCSI_OFF + INQUIRY_REPLY_LEN ];
unsigned char cmdblk [ INQUIRY_CMDLEN ] =
{ INQUIRY_CMD, /* command */
0, /* lun/reserved */
0, /* page code */
0, /* reserved */
INQUIRY_REPLY_LEN, /* allocation length */
0 };/* reserved/flag/link */
memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
/*
* +------------------+
* | struct sg_header | <- cmd
* +------------------+
* | copy of cmdblk | <- cmd + SCSI_OFF
* +------------------+
*/
if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd,
sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
fprintf( stderr, "Inquiry failed\n" );
exit(2);
}
return (Inqbuffer + SCSI_OFF);
}
��̗�͎��̂悤�ȍ\���ɂȂ��Ă��܂��BInquiry ���͂��̃R�}���h����
�ʃw�b�_�̂���(SCSI_OFF�ɂ��ė^�����܂�)�ɃR�s�[���܂��B���̓f�[�^
�͂��̃R�}���h�ɑ��Ă͑��݂��܂���B Handle_SCSI_cmd ���w�b�_�\����
���`���܂��B����� main ������A���̍�ƒ��̌��{�v���O�������
�ł��܂��B
void main( void )
{
fd = open(DEVICE, O_RDWR);
if (fd < 0) {
fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
exit(1);
}
/* Inquiry �̌��ʂ̈ꕔ�̃t�B�[���h��\�� */
printf( "%s\n", Inquiry() + INQUIRY_VENDOR );
}
�ŏ��Ƀf�o�C�X�I�[�v�����A�G���[��`�F�b�N���Ă���A���ʂ̃T�u���[�`��
��Ăяo���܂��B���̌�A�x���_�A���i�y�у��r�W�����Ȃǂ̌��ʂ�l�Ԃ���
�߂�`���ŕ\�����܂��B
����: Inquiry �̌��ʂɂ͂��̏����ȃv���O�����������������Ƒ�����
�����܂��B���̃v���O������f�o�C�X�̎�ނ� ANSI �̃o�[�W�����Ȃ�
��o���悤�Ɋg���������Ȃ邩����܂���B�f�o�C�X�̎�ނɂ͓��ʂȏd�v
��������܂��B�Ƃ����̂͂��ꂪ���̑��u�ɑ���K�{����уI�v�V�����̃R
�}���h�Z�b�g��肷�邩��ł��B�����ł����v���O�����������Ȃ��̂ł�
��AEric Youngdale �ɂ�� scsiinfo �v���O������g�p���邱�Ƃ�ł���
���Bscsiinfo �� SCSI ���u�ɂ��Ă̂قƂ�ǑS�Ă̏���v�������̂�
���Btsx-11.mit.edu �� pub/Linux/ALPHA/scsi ����������B
10. �Z���X�o�b�t�@
�o�̓f�[�^�̂Ȃ��R�}���h�̓Z���X�o�b�t�@(�w�b�_�\���̂̈ꕔ�ł�)�ɂ�
�ăX�e�[�^�X����ł��܂��B�Z���X�f�[�^�͒��O�̃R�}���h�� CHECK
CONDITION �X�e�[�^�X�Ȃ��ďI�������Ƃ��ɗ��p���邱�Ƃ��ł��܂��B��
�̏ꍇ�̓J�[�l���������I�ɃZ���X�f�[�^�� REQUEST SENSE �R�}���h�ɂ�
�ĉ���܂��B���̍\���͈ȉ��̒ʂ�ł��F
+=====-========-========-========-========-========-========-========-========+
| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|Byte | | | | | | | | |
|=====+========+==============================================================|
| 0 | Valid | Error Code (70h or 71h) |
|-----+-----------------------------------------------------------------------|
| 1 | Segment Number |
|-----+-----------------------------------------------------------------------|
| 2 |Filemark| EOM | ILI |Reserved| Sense Key |
|-----+-----------------------------------------------------------------------|
| 3 | (MSB) |
|- - -+--- Information ---|
| 6 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 7 | Additional Sense Length (n-7) |
|-----+-----------------------------------------------------------------------|
| 8 | (MSB) |
|- - -+--- Command-Specific Information ---|
| 11 | (LSB) |
|-----+-----------------------------------------------------------------------|
| 12 | Additional Sense Code |
|-----+-----------------------------------------------------------------------|
| 13 | Additional Sense Code Qualifier |
|-----+-----------------------------------------------------------------------|
| 14 | Field Replaceable Unit Code |
|-----+-----------------------------------------------------------------------|
| 15 | SKSV | |
|- - -+------------ Sense-Key Specific ---|
| 17 | |
|-----+-----------------------------------------------------------------------|
| 18 | |
|- - -+--- Additional Sense Bytes ---|
| n | |
+=============================================================================+
���ӁF�ł��ɗ��t�B�[���h�� Sense Key(``''�͂�݂Ă�����
��)�AAdditional Sense Code ����� Additional Sense Code
Qualifier(``''�͂�݂Ă�������)�ł��B
11. �Z���X�o�b�t�@��p�����
�����ł̓��f�B�A�����u�ɓ��ڂ���Ă��邩�ǂ���������邽�߂� TEST
UNIT READY �R�}���h��g�p���܂��Binquiry �̗�ɂ���w�b�_�̐錾�Ɗ�
handle_SCSI_cmd �����l�ɕK�v�ł��B
Table 73: TEST UNIT READY Command
+=====-========-========-========-========-========-========-========-========+
| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|Byte | | | | | | | | |
|=====+=======================================================================|
| 0 | Operation Code (00h) |
|-----+-----------------------------------------------------------------------|
| 1 | Logical Unit Number | Reserved |
|-----+-----------------------------------------------------------------------|
| 2 | Reserved |
|-----+-----------------------------------------------------------------------|
| 3 | Reserved |
|-----+-----------------------------------------------------------------------|
| 4 | Reserved |
|-----+-----------------------------------------------------------------------|
| 5 | Control |
+=============================================================================+
�ȉ����������������ł��F
#define TESTUNITREADY_CMD 0
#define TESTUNITREADY_CMDLEN 6
#define ADD_SENSECODE 12
#define ADD_SC_QUALIFIER 13
#define NO_MEDIA_SC 0x3a
#define NO_MEDIA_SCQ 0x00
int TestForMedium ( void )
{
/* request READY status */
static unsigned char cmdblk [TESTUNITREADY_CMDLEN] = {
TESTUNITREADY_CMD, /* command */
0, /* lun/reserved */
0, /* reserved */
0, /* reserved */
0, /* reserved */
0};/* control */
memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
/*
* +------------------+
* | struct sg_header | <- cmd
* +------------------+
* | copy of cmdblk | <- cmd + SCSI_OFF
* +------------------+
*/
if (handle_SCSI_cmd(sizeof(cmdblk), 0, cmd,
0, NULL)) {
fprintf (stderr, "Test unit ready failed\n");
exit(2);
}
return
*(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) !=
NO_MEDIA_SC ||
*(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) !=
NO_MEDIA_SCQ;
}
����main���Ƒg�ݍ��킹��ƁA�`�F�b�N��s�����Ƃ��ł��܂��B
void main( void )
{
fd = open(DEVICE, O_RDWR);
if (fd < 0) {
fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
exit(1);
}
/* look if medium is loaded */
if (!TestForMedium()) {
printf("device is unloaded\n");
} else {
printf("device is loaded\n");
}
}
�t�^�̃t�@�C�� generic_demo.c �ɂ͗����̗Ⴊ�܂܂�܂��B
12. ioctl ��
��� ioctl ����p���邱�Ƃ��ł��܂��F
o ioctl(fd, SG_SET_TIMEOUT, &Timeout); �̓^�C���A�E�g�l�� Timeout *
10 �~���b�ɐݒ肵�܂��B Timeout �� int �Ƃ��Đ錾����˂Ȃ�܂�
��B
o ioctl(fd, SG_GET_TIMEOUT, &Timeout); �͌��݂̃^�C���A�E�g�l��
���BTimeout �� int �Ƃ��Đ錾����˂Ȃ�܂���B
13. �h���C�o�̃f�t�H���g
13.1. Transfer Lengths �`�B��
����(���Ȃ��Ƃ�J�[�l���o�[�W���� 1.1.68 �܂�)�͓��͂���яo�͂̑傫��
�̓J�[�l���� SG_BIG_BUFF ���`���ăR���p�C������Ă��Ȃ�����4096 �o�C
�g�ȉ��łȂ���Ȃ�܂���B��`�����ꍇ�� SG_BIG_BUFF (��: 32768)�o�C
�g�ɐ�������܂��B�����̑傫���͓��͂̃R�}���h�u���b�N�����łȂ�����
�w�b�_��܂݂܂��B SG_BIG_BUFF �� (131072-512) �܂ň��S�ɑ��₹�܂��B
����̗��_��邽�߂ɂ́A���_�A�V�����J�[�l����R���p�C����
�N�������K�v������܂��B
13.2. �^�C���A�E�g�y�эĎ��s�̒l
�f�t�H���g�̃^�C���A�E�g�l�͈ꕪ��(Timeout = 6000)�ɃZ�b�g����Ă���
���B ioctl ��Ăяo��(``''�͂�݂Ă�������)���ƂŕύX�ł��܂��B�Ď��s
�̃f�t�H���g�̒l�� 1 �ł��B
14. SCSI �̎d�l�̎擾
SCSI-1 ����� SCSI-2 (�����ĂЂ��Ƃ���Ƃ܂�Ȃ� SCSI-3) �Ɩ�������
���W���K�i�����݂��܂��B�W���K�i�͑啔����ʌ݊��ł��B
SCSI-1 �W���K�i��(�M�҂̈ӌ��ł�)�قƂ�ǎ���x��ŁASCSI-2 ���ł�L��
�͂ɂ킽���Ďg���Ă��܂��BSCSI-3 �͂����ւ�V�����ĂƂĂ����ł��B
�����̕W�������ꂽ�R�}���h�Z�b�g�� SCSI �����Ǝ҂ɑ��ĕK�{�̂����
�I�v�V�����̃R�}���h��w�肵�Ă���A�W��������Ă��炸�v���O�����~���O
�̂��߂̏���ő��ɗ��p�ł��Ȃ��x���_�Ǝ��̊g���R�}���h�ɗD�悵�đI��
���ׂ��ł��B
�ŐV�̑��Ă̓d�q�I�ȕ��ʂ͈ȉ��� anonymous ftp �����ł��܂��F
o ftp.cs.tulane.edu:pub/scsi
o ftp.symbios.com:/pub/standards
o ftp.cs.uni-sb.de:/pub/misc/doc/scsi
(���� Yggdrasil Linux CD-ROM �̃f�B���N�g�� /usr/doc/scsi-2 �����
/usr/doc/scsi-1 ������ SCSI �d�l�����ɓ���܂����B)
SCSI FAQ �ł�ȉ��̈���̏����Ă��܂��F
The SCSI specification: Available from: SCSI �d�l���F�ȉ��������
�\�F
Global Engineering Documents
15 Inverness Way East
Englewood Co 80112-5704
(800) 854-7179
SCSI-1: X3.131-1986
SCSI-2: X3.131-199x
SCSI-3 X3T9.2/91-010R4 Working Draft
(Global Engineering Documentation in Irvine, CA (714)261-1455??)
SCSI-1: Doc \# X3.131-1986 from ANSI, 1430 Broadway, NY, NY 10018
IN-DEPTH EXPLORATION OF SCSI can be obtained from
Solution Technology, Attn: SCSI Publications, POB 104, Boulder Creek,
CA 95006, (408)338-4285, FAX (408)338-4374
THE SCSI ENCYLOPEDIA and the SCSI BENCH REFERENCE can be obtained from
ENDL Publishing, 14426 Black Walnut Ct., Saratoga, CA 95090,
(408)867-6642, FAX (408)867-2115
SCSI: UNDERSTANDING THE SMALL COMPUTER SYSTEM INTERFACE was published
by Prentice-Hall, ISBN 0-13-796855-8
[��]���{��̏���
(��������̂łł����A�Ƃ肠�������A��҂̎苖�ɂ����̂��������܂��B
�R�����g���҂����Ă��܂��B)
(1)SCSI-2�ڍ��F�ŐVSCSI�K�i�ƃR�}���h�E���t�@�����X. ���J ���� ��.
CQ�o�Ŏ�. 1994 ����. ISBN 4-7898-3523-5
(2)SCSI�C���^�[�t�F�[�X�e�N�j�J���u�b�N NEC PC-9800�V���[�Y�Ή� ����Ŋw��SCSI�C���^�[�t�F�[�X NEC PC-9800�V���[�Y�v���O���}�K�g
1989.8.1 ���Ŕ��s
(��)�R�[���� (C)NEC Corporation
SCSI�C���^�[�t�F�[�X�{�[�h(PC-9801-55�ɓ��ڂ���Ă���WD33C93�ւ̃A�N�Z�X���@)�ASCSI�C���^�[�t�F�[�X����BIOS(SCSI�@���ėp�I�ɐ���ł��郌�x��)�ASCSI�C���^�[�t�F�[�X�Ή��Œ�BIOS�̎O���\������Ȃ�B
15. �֘A���
15.1. HOWTOs and FAQs HOWTO �� FAQ
Drew Eckhardt �ɂ�� Linux SCSI-HOWTO �͑��u�ŗL�̎��₾���łȂ��S�Ă�
�T�|�[�g����� SCSI �R���g���[����ԗ����Ă��܂��B
SCSI �ɂ��Ă̈�ʓI�Ȏ���̓j���[�X�O���[�v Comp.Periphs.Scsi �ł�
SCSI-FAQ �̒��ʼn���Ă��܂�( tsx-11 �� pub/linux/ALPHA/scsi �����
�~���[�T�C�g�����\)
15.2. ���[�����O���X�g
Linux �ł� SCSI �̊J���ɊW�����o�O�Ǝ���ɂ��Ă� mailing list
������܂��B�Q�����邽�߂ɂ́A�ʐM���̖{�̂� subscribe linux-scsi �̍s
����ā
[email protected] �ɓd�q���[���𑗂��Ă��������B��
�M����
[email protected] �ɓ��e���܂��傤�B�w���v������
"help" �̍s����
[email protected] �ɓd�q���[���𑗂�Ηv
���ł��܂��B
15.3. �R�[�h��
sunsite.unc.edu: apps/graphics/hpscanpbm-0.3a.tar.gz
���̃p�b�P�[�W�� HP �X�L�����W�F�b�g�X�L���i�[��ėp�C���^�[�t�F
�[�X��ʂ��đ��c���܂��B
tsx-11.mit.edu: BETA/cdrom/private/mkisofs/cdwrite-1.3.tar.gz
cdwrite �p�b�P�[�W�͔ėp�C���^�[�t�F�[�X�� CD �̃C���[�W�� CD ��
�C�^�[�ɏ����̂Ɏg���܂��B
sunsite.unc.edu: apps/sound/cds/cdda2wav*.src.tar.gz
�p�m�炸�ɂ����̃A�v���P�[�V�����̐�`�ŁA�I�[�f�B�I CD �g���b
�N�� wav �t�@�C���ւƃR�s�[���܂��B[��]�ŋ߁Acdda2wav��荂��
���������\�t�g�������[�X����܂����B�Ȃ�Ă����������H
16. ���ɖ�ɗ����
�Ȃɂ��ƒ��@�����̂ɂ��āB���ƐV�����Ƃ��D��Ă����̂����邩��
�����Ȃǂ͂悭�킩��܂���B���Ђ��ӌ���B
16.1. �f�o�C�X�h���C�o����l�̏����ɂȂ���
�����̕����� sunsite.unc.edu ftp �T�[�o����т��̃~���[�ł݂��邱
�Ƃ��ł��܂��B
/pub/Linux/docs/kernel/kernel-hackers-guide
LDP (Linux Documentation Project) �̃J�[�l���n�b�J�[�Y�K�C�h�B
�����Ǝ���x�ꂩ����܂��A���Ƃ��b�I�Ȏ�����J�o�[��
�Ă��܂��B
/pub/Linux/docs/kernel/drivers.doc.z
���̕����̓L�����N�^�h���C�o�̏���������Ă��܂��B
/pub/Linux/docs/kernel/tutorial.doc.z
�L�����N�^�f�o�C�X�̍쐬�ɂ��ăR�[�h�t���ł̃`���[�g���A���B
/pub/Linux/docs/kernel/scsi.paper.tar.gz
SCSI �h���C�o�̏�������L�q������LaTeX �����B
/pub/Linux/docs/hardware/DEVICES
Linux �Ŏg�p����郁�W���[�f�o�C�X�ƃ}�C�i�[�f�o�C�X�̃��X�g
The Linux Kernel
�ŏ���ɒlj����܂����B����LDP�̕����B David A Rusling �����
����́B���\�����Ǝv���܂��B�����Ƃ��Ă� LINUX Kernel
Internals (Addison Wesley)�Ɏ��Ă܂����A�R�[�h��͂��܂肠��܂�
��B
16.2. ���[�e�B���e�B
tsx-11.mit.edu: ALPHA/scsi/scsiinfo*.tar.gz
SCSI ���u�ɑ��đ���p�����[�^�A���׃��X�g�Ȃǂ�₢���킹�邽
�߂̃v���O�����BX �E�B���h�E�V�X�e���x�[�X�̃C���^�[�t�F�[�X��
�p���邱�Ƃ��ł��܂��B������ Tk/Tcl/wish �̃C���X�g�[�����K�v��
���B X �x�[�X�̃C���^�[�t�F�[�X��p����Ηe�ՂɃh���C�u�̐ݒ��
�ύX���邱�Ƃ��ł��܂��B
tsx-11.mit.edu: ALPHA/kdebug
�J�[�l����f�o�b�O���邽�߂� gdb �̊g��
17. SCSI �ɃA�N�Z�X���邻�̑��̃C���^�[�t�F�[�X
Linux �ł� SCSI_IOCTL_SEND_COMMAND ioctl �̌Ăяo����p���� SCSI �ɃA
�N�Z�X����Ƃ����s���Ȏ�i����܂����A�����߂��܂���B
un*x �E�ł͈�ʂɗp�����Ă��鑼�̗ގ��̃C���^�[�t�F�[�X��������
�݂��܂����ALinux �Ŏg�����Ƃ͂ł��܂���B
1. CAM (Common Access Method���ʃA�N�Z�X�@])�BFuture Domain �y�ё�
��SCSI �x���_���J���BLinux �� SCSI CAM �V�X�e����܂��قƂ�ǃT�|�[
�g���Ă��܂���(��Ƀn�[�h�f�B�X�N����̃u�[�g�Ɋւ���)�B CAM �̓^�[
�Q�b�g���[�h���T�|�[�g���܂�����A�����̃R���s���[�^��Ӌ@���
���邩�̂悤�ɋU�����邱�Ƃ��肦�܂�(�܂菬���� SCSI �l�b�g���[
�N)�B
2. ASPI (Advanced SCSI Programming Interface)�BAdaptec���J���B�����
MS-DOS �}�V�[���ɂƂ��Ă̎�����̕W���ł��B
���ɓ��l�ɂ��� SCO(TM), NeXT(TM), Silicon Graphics(TM) ����� SUN(TM)
�ł̃A�v���P�[�V�����C���^�[�t�F�[�X������܂��B
18. ������
�ėp SCSI �C���^�[�t�F�[�X�̓��[�U�A�v���P�[�V�����Ɠ���̃f�o�C�X�̊�
�̍a��n�����܂��B�������ގ������ᐅ���̊��Q������v���O������
�т����������݂������́A���ʂ̖ړI�ɑ����ʉ����ꂽ�ᐅ�����Q��
����L���C�u�������ɓ���������]�܂����Ƃ����܂��B��v�ȖڕW��
�C���^�[�t�F�[�X����Ɨ������w���ɓ���邱�Ƃł���ׂ��ł��B�A�v���P
�[�V�������x���ȃ��[�`���ƃn�[�h�E�F�A�Ɉˑ����郋�[�`���Ƃɕ�����
��̂��悢�v�ł��傤�B�ᐅ�����[�`���͋��L���C�u�����ɓ���邱�Ƃ���
����ł��傤���A�S�ẴA�v���P�[�V�������痘�p�ł���悤�ɂȂ�ł���
���B�����ŁA�W�������ꂽ�C���^�[�t�F�[�X���ł�����V������̂����
���ɑ����ׂ��ł��B
���ł݂͂Ȃ���͎��������� Linux �ėp SCSI �C���^�[�t�F�[�X�ɂ�
�ďڂ����͂��ł��B�ł����炢�܂�S���E�� Linux �R�~���j�e�B�̗��v�̂�
�߂ɁA���͂ȃA�v���P�[�V�����̊J���ɒ���ł��܂��B
19. �ӎ�
Jeff Tranter �ɂ͂��̕�����O�ɍZ�������ǂ��Ă��ꂽ���Ƃɂق�Ƃ���
���ӂ��܂��B��ɗ���]��� Carlos Phchol �ɂ�B�������̃C���^�[
�t�F�[�X�̎g�p�ɂ��čŏ���(����)���₵���Ƃ��� Drew Eckhardt ��
Eric Youngdale �������Ă��ꂽ���Ƃ��肪�����v���Ă��܂��B
T. �t�^
U. �G���[����
�� open, ioctl, write ����� read �̓G���[�����\���������
���B���̏ꍇ�A���̕Ԃ�l�� -1 �ő��ϐ� errno �ɃG���[�ԍ����^����
��܂��B errno �̒l�� /usr/include/errno.h �ɂ����Ē�`����Ă��܂��B
�ȉ��̂悤�Ȓl��Ƃ肦�܂��F
�� | �G���[ | ���
=========|==============|=============================================
open | ENXIO | �f�o�C�X������
| EACCES | �A�N�Z�X���[�h��read/write(O_RDWR)�łȂ�
| EBUSY | �f�o�C�X�ɑ��u���b�N���Ȃ��A�N�Z�X���v��
| | ���ꂽ���A���݂̓r�W�[��ԁB
| ERESTARTSYS | ����͓��̃G���[����B�Č��\�ɂ���
| | SCSI �`�����l���ɕ�ꂽ��(�o�O�̏ڍ�
| | �� Drew Eckhardts �ɂ�� SCSI-HOWTO ��݂�)
ioctl | ENXIO | �f�o�C�X������
read | EAGAIN | �f�o�C�X���u���b�N���悤�Ƃ���B��ōĎ��s��B
| ERESTARTSYS | ���ꂪ���̃G���[����B�Č��\�ɂ���
| | SCSI �`�����l���ɕ�ꂽ��(�o�O�̏ڍ�
| | �� Drew Eckhardts �ɂ�� SCSI-HOWTO ��݂�)
write | EIO | �������Z������ (���ʃw�b�_�\���̂�菬����)�B
| | �x��: ���݂̏��A�������߂̊m�F�͂Ȃ��B
| EAGAIN | �f�o�C�X���u���b�N���悤�Ƃ���B��ōĎ��s��B
| ENOMEM | ���̗v���ɕK�v�ȃ���������Ăł��Ȃ������B
| | �ő�`���T�C�Y���Ă��Ȃ��Ȃ�Ό�ōĎ��s
| | ��(���݂�)�B
select | | �Ȃ�
close | | �Ȃ�
read/write �̐��̕Ԃ�l�͗�ɂ��ē`���ɐ��������o�C�g������Ă���
���B����͗v�������o�C�g���Ɠ������ׂ��ł��B
U.1. �G���[�X�e�[�^�X�̉��
����ɂ��ڍׂȕ��J�[�l���� hd_status �� �f�o�C�X�� sense_buffer
�ɂ��ĂȂ���܂�(``''�͂�݂Ă�������)�B��������ʃw�b�_�\���̂ɂ�
��܂��B
hd_status �̈Ӗ��� drivers/scsi/scsi.h �Œ���܂��F���� unsigned
int �͈قȂ镔������\������Ă��܂��B
lsb | ... | ... | msb
=======|===========|===========|============
status | sense key | host code | driver byte
drivers/scsi/scsi.h�ł����̃}�N�����ɓ���邱�Ƃ��ł���̂ł����A
�s�K�ɂ��Ė��s�v�c�ȃw�b�_�t�@�C���̑��݈ˑ��̂��߂ɊȒP�ɂ͎g���܂�
��B������ꂢ�ɂ��Ȃ��Ƃ����܂���B
�}�N�� | ���
=======================|====================================================
status_byte(hd_status) | SCSI ���u�̏�ԁB�X�e�[�^�X�R�[�h�̏͂�݂�B
msg_byte(hd_status) | ���u���BSCSI sense keys �̏͂�݂�B
host_byte(hd_status) | �J�[�l�����B Hostcodes �̏͂�݂�B
driver_byte(hd_status) | �J�[�l�����B. midlevel codes �̏͂�݂�B
U.2. �X�e�[�^�X�R�[�h
�ȉ���SCSI ���u����Ԃ����X�e�[�^�X�R�[�h��(scsi/scsi.h�Œ�`�����
���܂�)���p�\�ł��B
�l | �V���{��
======|=====================
0x00 | GOOD
0x01 | CHECK_CONDITION
0x02 | CONDITION_GOOD
0x04 | BUSY
0x08 | INTERMEDIATE_GOOD
0x0a | INTERMEDIATE_C_GOOD
0x0c | RESERVATION_CONFLICT
�����̃V���{���̒l�͉E�Ɉ�V�t�g����Ă��邱�Ƃɒ��ӂ��Ă��������B
�X�e�[�^�X�� CHECK_CONDITION �̂Ƃ��Ȃ�A�Z���X�o�b�t�@��̃Z���X�f
�[�^�͗L���ł�(���ɒlj��I�ȃZ���X�R�[�h�ƒlj��I�ȃZ���X�R�[�h�N�I��
�t�@�C�A��m�F����������)�B
�����̒l�ɂ� SCSI-2 �d�l���ɂ��Ǝ��̂悤�ȈӖ�������܂��B
Table 27: Status Byte Code
+=================================-==============================+
| Bits of Status Byte | Status |
| 7 6 5 4 3 2 1 0 | |
|---------------------------------+------------------------------|
| R R 0 0 0 0 0 R | GOOD |
| R R 0 0 0 0 1 R | CHECK CONDITION |
| R R 0 0 0 1 0 R | CONDITION MET |
| R R 0 0 1 0 0 R | BUSY |
| R R 0 1 0 0 0 R | INTERMEDIATE |
| R R 0 1 0 1 0 R | INTERMEDIATE-CONDITION MET |
| R R 0 1 1 0 0 R | RESERVATION CONFLICT |
| R R 1 0 0 0 1 R | COMMAND TERMINATED |
| R R 1 0 1 0 0 R | QUEUE FULL |
| | |
| All Other Codes | Reserved |
|----------------------------------------------------------------|
| Key: R = Reserved bit |
+================================================================+
�X�e�[�^�X�o�C�g�R�[�h�̒�`��ȉ��ɗ^����B
GOOD. ���̏�Ԃ̓^�[�Q�b�g���R�}���h�̎��s�ɐ����������Ƃ���B
CHECK CONDITION. ���̏�Ԃ� contingent allegiance condition ����������
���Ƃ���B(6.6��݂�)�B
CONDITION MET. ���̏�Ԃ����� INTERMEDIATE-CONDITION MET �͗v������
���삪�B�����ꂽ�Ƃ��ɂ͂��ł�Ԃ����B(SEARCH DATA �y�� PRE-FETCH
�R�}���h��݂�)�B
BUSY. ���̏�Ԃ̓^�[�Q�b�g���r�W�[�ł��邱�Ƃ���B���̏�Ԃ̓^�[�Q�b�g
���R�}���h��̑��̎�t�\�ȃC�j�V�G�[�^(���Ȃ킿�ۗ��ł��Ȃ��Փ�)�����
�R�}���h��t���邱�Ƃ��ł��Ȃ��Ƃ��͂��ł�Ԃ����ł��낤�B��������
��C�j�V�G�[�^�̉���͌�̎��_�ōĂуR�}���h�s���邱�Ƃł���B
INTERMEDIATE. ���̏�Ԃ����� INTERMEDIATE-CONDITION MET �́A�R�}���h��
CHECK CONDITION, RESERVATION CONFLICT ������ COMMAND TERMINATED �X�e�[�^�X
�ɂ��Ă͏I�����Ȃ������ꍇ�ɁA��Ȃ���̘A�������R�}���h�Q(�Ō�̃R�}��
�h���)�ɂ����Ċe�R�}���h�̎��s�ɐ��������Ƃ��ɕԂ����B�� INTERMEDIATE
���邢�� INTERMEDIATE-CONDITION MET �X�e�[�^�X���Ԃ���Ȃ��Ȃ�A���̘A����
���R�}���h��͏I�����ē��o�͑���͏I�����Ă���B
INTERMEDIATE-CONDITION MET. ���̏�Ԃ� CONDITON MET �� INTERMEDIATE �X�e�[�^
�X���g����������̂ł���B
RESERVATION CONFLICT. ���̏�Ԃ̓C�j�V�G�[�^���ʂ� SCSI ���u�ɑ��ďՓ˕ۗ�
�\��^�Ƃ��Ďw�肳��Ă��郍�W�J�����j�b�g�����̓��W�J�����j�b�g���̒��x
[?? extent ??]�ɃA�N�Z�X��݂��ꍇ�ɕK���Ԃ����B���������C�j�V�G�[�^�̉�
����͌�̎��_�ōēx�R�}���h�s���邱�Ƃł���B
COMMAND TERMINATED. ���̏�Ԃ� TERMINATE I/O PROCESS ���b�Z�[�W(5.6.22 ��݂�)
��������ƂŃ^�[�Q�b�g�����݂̓��o�͑����I��������ꍇ�ɕԂ����B����
��Ԃ͂܂� contingent allegiance condition �������������Ƃ����Ă���(6.6 ��݂�)�B
QUEUE FULL. ���̏�Ԃ̓^�O�t�����ꂽ�L���[���삪��������Ă���ꍇ�Ɏ��������
�Ƃ���B���̏�Ԃ� SIMPLE QUEUE TAG, ORDERED QUEUE TAG ������ HEAD OF QUEUE TAG
���b�Z�[�W������R�}���h�L���[�������ς��ł���Ƃ��ɕԂ����B���o�͑���
�̓R�}���h�L���[��ɔz�u����Ȃ��B
U.3. SCSI Sense Keys
�����̃J�[�l���V���{��(scsi/scsi.h���)�����炩���ߒ�`����Ă���
���B
Value | Symbol
======|================
0x00 | NO_SENSE
0x01 | RECOVERED_ERROR
0x02 | NOT_READY
0x03 | MEDIUM_ERROR
0x04 | HARDWARE_ERROR
0x05 | ILLEGAL_REQUEST
0x06 | UNIT_ATTENTION
0x07 | DATA_PROTECT
0x08 | BLANK_CHECK
0x0a | COPY_ABORTED
0x0b | ABORTED_COMMAND
0x0d | VOLUME_OVERFLOW
0x0e | MISCOMPARE
SCSI-2 �����ɂ��郊�X�g���̂܂܂͈ȉ��̒ʂ�ł�(7.2.14.3 �͂��)�B
Table 69: Sense Key (0h-7h) Descriptions
+========-====================================================================+
| Sense | Description |
| Key | |
|--------+--------------------------------------------------------------------|
| 0h | NO SENSE. Indicates that there is no specific sense key |
| | information to be reported for the designated logical unit. This |
| | would be the case for a successful command or a command that |
| | received CHECK CONDITION or COMMAND TERMINATED status because one |
| | of the filemark, EOM, or ILI bits is set to one. |
|--------+--------------------------------------------------------------------|
| 1h | RECOVERED ERROR. Indicates that the last command completed |
| | successfully with some recovery action performed by the target. |
| | Details may be determinable by examining the additional sense |
| | bytes and the information field. When multiple recovered errors |
| | occur during one command, the choice of which error to report |
| | (first, last, most severe, etc.) is device specific. |
|--------+--------------------------------------------------------------------|
| 2h | NOT READY. Indicates that the logical unit addressed cannot be |
| | accessed. Operator intervention may be required to correct this |
| | condition. |
|--------+--------------------------------------------------------------------|
| 3h | MEDIUM ERROR. Indicates that the command terminated with a non- |
| | recovered error condition that was probably caused by a flaw in |
| | the medium or an error in the recorded data. This sense key may |
| | also be returned if the target is unable to distinguish between a |
| | flaw in the medium and a specific hardware failure (sense key 4h).|
|--------+--------------------------------------------------------------------|
| 4h | HARDWARE ERROR. Indicates that the target detected a non- |
| | recoverable hardware failure (for example, controller failure, |
| | device failure, parity error, etc.) while performing the command |
| | or during a self test. |
|--------+--------------------------------------------------------------------|
| 5h | ILLEGAL REQUEST. Indicates that there was an illegal parameter in|
| | the command descriptor block or in the additional parameters |
| | supplied as data for some commands (FORMAT UNIT, SEARCH DATA, |
| | etc.). If the target detects an invalid parameter in the command |
| | descriptor block, then it shall terminate the command without |
| | altering the medium. If the target detects an invalid parameter |
| | in the additional parameters supplied as data, then the target may|
| | have already altered the medium. This sense key may also indicate|
| | that an invalid IDENTIFY message was received (5.6.7). |
|--------+--------------------------------------------------------------------|
| 6h | UNIT ATTENTION. Indicates that the removable medium may have been|
| | changed or the target has been reset. See 6.9 for more detailed |
| | information about the unit attention condition. |
|--------+--------------------------------------------------------------------|
| 7h | DATA PROTECT. Indicates that a command that reads or writes the |
| | medium was attempted on a block that is protected from this |
| | operation. The read or write operation is not performed. |
+=============================================================================+
Table 70: Sense Key (8h-Fh) Descriptions
+========-====================================================================+
| Sense | Description |
| Key | |
|--------+--------------------------------------------------------------------|
| 8h | BLANK CHECK. Indicates that a write-once device or a sequential- |
| | access device encountered blank medium or format-defined end-of- |
| | data indication while reading or a write-once device encountered a|
| | non-blank medium while writing. |
|--------+--------------------------------------------------------------------|
| 9h | Vendor Specific. This sense key is available for reporting vendor|
| | specific conditions. |
|--------+--------------------------------------------------------------------|
| Ah | COPY ABORTED. Indicates a COPY, COMPARE, or COPY AND VERIFY |
| | command was aborted due to an error condition on the source |
| | device, the destination device, or both. (See 7.2.3.2 for |
| | additional information about this sense key.) |
|--------+--------------------------------------------------------------------|
| Bh | ABORTED COMMAND. Indicates that the target aborted the command. |
| | The initiator may be able to recover by trying the command again. |
|--------+--------------------------------------------------------------------|
| Ch | EQUAL. Indicates a SEARCH DATA command has satisfied an equal |
| | comparison. |
|--------+--------------------------------------------------------------------|
| Dh | VOLUME OVERFLOW. Indicates that a buffered peripheral device has |
| | reached the end-of-partition and data may remain in the buffer |
| | that has not been written to the medium. A RECOVER BUFFERED DATA |
| | command(s) may be issued to read the unwritten data from the |
| | buffer. |
|--------+--------------------------------------------------------------------|
| Eh | MISCOMPARE. Indicates that the source data did not match the data|
| | read from the medium. |
|--------+--------------------------------------------------------------------|
| Fh | RESERVED. |
+=============================================================================+
U.4. Host codes
�ȉ��� host code �� drivers/scsi/scsi.h �ɂ����Ē�`����Ă��܂��B����
��̓J�[�l���h���C�o�ɂ��Z�b�g����܂��B
Value | Symbol | Description
======|================|========================================
0x00 | DID_OK | No error
0x01 | DID_NO_CONNECT | Couldn't connect before timeout period
0x02 | DID_BUS_BUSY | BUS stayed busy through time out period
0x03 | DID_TIME_OUT | TIMED OUT for other reason
0x04 | DID_BAD_TARGET | BAD target
0x05 | DID_ABORT | Told to abort for some other reason
0x06 | DID_PARITY | Parity error
0x07 | DID_ERROR | internal error
0x08 | DID_RESET | Reset by somebody
0x09 | DID_BAD_INTR | Got an interrupt we weren't expecting
U.5. Driver codes
���ԑw�̃h���C�o�͑��u����̃Z���X�L�[�Ɋ�Â��Ēᐅ���h���C�o����Ԃ�
�ꂽ��Ԃ�ޕʂ��܂��B����ɍĎ��s�A���~���邢�͍ă}�b�v�Ƃ������Ƃ��
���������̓��������܂��B
Value | Symbol | Description of Driver status
======|================|========================================
0x00 | DRIVER_OK | No error
0x01 | DRIVER_BUSY | not used
0x02 | DRIVER_SOFT | not used
0x03 | DRIVER_MEDIA | not used
0x04 | DRIVER_ERROR | internal driver error
0x05 | DRIVER_INVALID | finished (DID_BAD_TARGET or DID_ABORT)
0x06 | DRIVER_TIMEOUT | finished with timeout
0x07 | DRIVER_HARD | finished with fatal error
0x08 | DRIVER_SENSE | had sense information available
Value | Symbol | Description of suggestion
======|================|========================================
0x10 | SUGGEST_RETRY | retry the SCSI request
0x20 | SUGGEST_ABORT | abort the request
0x30 | SUGGEST_REMAP | remap the block (not yet implemented)
0x40 | SUGGEST_DIE | let the kernel panic
0x80 | SUGGEST_SENSE | get sense information from the device
0xff | SUGGEST_IS_OK | nothing to be done
V. Additional sense codes ����� additional sense code qualifiers
���s���ꂽ SCSI �R�}���h�̏�Ԃ� CHECK_CONDItiON �̎��ɂ́A�Z���X�o�b
�t�@��̃Z���X�f�[�^�����p�\�ł��Badditional sense code ��
additional sense code qualifier �����̃o�b�t�@�̒��Ɋ܂܂�Ă��܂��B
SCSI-2 �̎d�l������̕\��Z�����܂��B�ŏ��̂�͎̂������ŁA��Ԗ�
�̂�͔̂ԍ����ł��B
V.1. ASC and ASCQ(������)
���̕\�̃��X�g�͉��̃��X�g�Ƃ��ꂪ�K�p�����f�o�C�X�̎�ނƂ����
���B
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 13h 00h D W O ADDRESS MARK NOT FOUND FOR DATA FIELD |
| 12h 00h D W O ADDRESS MARK NOT FOUND FOR ID FIELD |
| 00h 11h R AUDIO PLAY OPERATION IN PROGRESS |
| 00h 12h R AUDIO PLAY OPERATION PAUSED |
| 00h 14h R AUDIO PLAY OPERATION STOPPED DUE TO ERROR |
| 00h 13h R AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED |
| 00h 04h T S BEGINNING-OF-PARTITION/MEDIUM DETECTED |
| 14h 04h T BLOCK SEQUENCE ERROR |
| 30h 02h DT WR O CANNOT READ MEDIUM - INCOMPATIBLE FORMAT |
| 30h 01h DT WR O CANNOT READ MEDIUM - UNKNOWN FORMAT |
| 52h 00h T CARTRIDGE FAULT |
| 3Fh 02h DTLPWRSOMC CHANGED OPERATING DEFINITION |
| 11h 06h WR O CIRC UNRECOVERED ERROR |
| 30h 03h DT CLEANING CARTRIDGE INSTALLED |
| 4Ah 00h DTLPWRSOMC COMMAND PHASE ERROR |
| 2Ch 00h DTLPWRSOMC COMMAND SEQUENCE ERROR |
| 2Fh 00h DTLPWRSOMC COMMANDS CLEARED BY ANOTHER INITIATOR |
| 2Bh 00h DTLPWRSO C COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT |
| 41h 00h D DATA PATH FAILURE (SHOULD USE 40 NN) |
| 4Bh 00h DTLPWRSOMC DATA PHASE ERROR |
| 11h 07h W O DATA RESYCHRONIZATION ERROR |
| 16h 00h D W O DATA SYNCHRONIZATION MARK ERROR |
| 19h 00h D O DEFECT LIST ERROR |
| 19h 03h D O DEFECT LIST ERROR IN GROWN LIST |
| 19h 02h D O DEFECT LIST ERROR IN PRIMARY LIST |
| 19h 01h D O DEFECT LIST NOT AVAILABLE |
| 1Ch 00h D O DEFECT LIST NOT FOUND |
| 32h 01h D W O DEFECT LIST UPDATE FAILURE |
| 40h NNh DTLPWRSOMC DIAGNOSTIC FAILURE ON COMPONENT NN (80H-FFH) |
| 63h 00h R END OF USER AREA ENCOUNTERED ON THIS TRACK |
| 00h 05h T S END-OF-DATA DETECTED |
| 14h 03h T END-OF-DATA NOT FOUND |
| 00h 02h T S END-OF-PARTITION/MEDIUM DETECTED |
| 51h 00h T O ERASE FAILURE |
| 0Ah 00h DTLPWRSOMC ERROR LOG OVERFLOW |
| 11h 02h DT W SO ERROR TOO LONG TO CORRECT |
| 03h 02h T EXCESSIVE WRITE ERRORS |
| 3Bh 07h L FAILED TO SENSE BOTTOM-OF-FORM |
| 3Bh 06h L FAILED TO SENSE TOP-OF-FORM |
| 00h 01h T FILEMARK DETECTED |
| 14h 02h T FILEMARK OR SETMARK NOT FOUND |
| 09h 02h WR O FOCUS SERVO FAILURE |
| 31h 01h D L O FORMAT COMMAND FAILED |
| 58h 00h O GENERATION DOES NOT EXIST |
+=============================================================================+
Table 71: (continued)
+=============================================================================+
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 1Ch 02h D O GROWN DEFECT LIST NOT FOUND |
| 00h 06h DTLPWRSOMC I/O PROCESS TERMINATED |
| 10h 00h D W O ID CRC OR ECC ERROR |
| 22h 00h D ILLEGAL FUNCTION (SHOULD USE 20 00, 24 00, OR 26 00) |
| 64h 00h R ILLEGAL MODE FOR THIS TRACK |
| 28h 01h M IMPORT OR EXPORT ELEMENT ACCESSED |
| 30h 00h DT WR OM INCOMPATIBLE MEDIUM INSTALLED |
| 11h 08h T INCOMPLETE BLOCK READ |
| 48h 00h DTLPWRSOMC INITIATOR DETECTED ERROR MESSAGE RECEIVED |
| 3Fh 03h DTLPWRSOMC INQUIRY DATA HAS CHANGED |
| 44h 00h DTLPWRSOMC INTERNAL TARGET FAILURE |
| 3Dh 00h DTLPWRSOMC INVALID BITS IN IDENTIFY MESSAGE |
| 2Ch 02h S INVALID COMBINATION OF WINDOWS SPECIFIED |
| 20h 00h DTLPWRSOMC INVALID COMMAND OPERATION CODE |
| 21h 01h M INVALID ELEMENT ADDRESS |
| 24h 00h DTLPWRSOMC INVALID FIELD IN CDB |
| 26h 00h DTLPWRSOMC INVALID FIELD IN PARAMETER LIST |
| 49h 00h DTLPWRSOMC INVALID MESSAGE ERROR |
| 11h 05h WR O L-EC UNCORRECTABLE ERROR |
| 60h 00h S LAMP FAILURE |
| 5Bh 02h DTLPWRSOM LOG COUNTER AT MAXIMUM |
| 5Bh 00h DTLPWRSOM LOG EXCEPTION |
| 5Bh 03h DTLPWRSOM LOG LIST CODES EXHAUSTED |
| 2Ah 02h DTL WRSOMC LOG PARAMETERS CHANGED |
| 21h 00h DT WR OM LOGICAL BLOCK ADDRESS OUT OF RANGE |
| 08h 00h DTL WRSOMC LOGICAL UNIT COMMUNICATION FAILURE |
| 08h 02h DTL WRSOMC LOGICAL UNIT COMMUNICATION PARITY ERROR |
| 08h 01h DTL WRSOMC LOGICAL UNIT COMMUNICATION TIME-OUT |
| 4Ch 00h DTLPWRSOMC LOGICAL UNIT FAILED SELF-CONFIGURATION |
| 3Eh 00h DTLPWRSOMC LOGICAL UNIT HAS NOT SELF-CONFIGURED YET |
| 04h 01h DTLPWRSOMC LOGICAL UNIT IS IN PROCESS OF BECOMING READY |
| 04h 00h DTLPWRSOMC LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE |
| 04h 04h DTL O LOGICAL UNIT NOT READY, FORMAT IN PROGRESS |
| 04h 02h DTLPWRSOMC LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED |
| 04h 03h DTLPWRSOMC LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED |
| 25h 00h DTLPWRSOMC LOGICAL UNIT NOT SUPPORTED |
| 15h 01h DTL WRSOM MECHANICAL POSITIONING ERROR |
| 53h 00h DTL WRSOM MEDIA LOAD OR EJECT FAILED |
| 3Bh 0Dh M MEDIUM DESTINATION ELEMENT FULL |
| 31h 00h DT W O MEDIUM FORMAT CORRUPTED |
| 3Ah 00h DTL WRSOM MEDIUM NOT PRESENT |
| 53h 02h DT WR OM MEDIUM REMOVAL PREVENTED |
| 3Bh 0Eh M MEDIUM SOURCE ELEMENT EMPTY |
| 43h 00h DTLPWRSOMC MESSAGE ERROR |
| 3Fh 01h DTLPWRSOMC MICROCODE HAS BEEN CHANGED |
| 1Dh 00h D W O MISCOMPARE DURING VERIFY OPERATION |
| 11h 0Ah DT O MISCORRECTED ERROR |
| 2Ah 01h DTL WRSOMC MODE PARAMETERS CHANGED |
| 07h 00h DTL WRSOM MULTIPLE PERIPHERAL DEVICES SELECTED |
| 11h 03h DT W SO MULTIPLE READ ERRORS |
| 00h 00h DTLPWRSOMC NO ADDITIONAL SENSE INFORMATION |
| 00h 15h R NO CURRENT AUDIO STATUS TO RETURN |
| 32h 00h D W O NO DEFECT SPARE LOCATION AVAILABLE |
| 11h 09h T NO GAP FOUND |
| 01h 00h D W O NO INDEX/SECTOR SIGNAL |
| 06h 00h D WR OM NO REFERENCE POSITION FOUND |
+=============================================================================+
Table 71: (continued)
+=============================================================================+
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 02h 00h D WR OM NO SEEK COMPLETE |
| 03h 01h T NO WRITE CURRENT |
| 28h 00h DTLPWRSOMC NOT READY TO READY TRANSITION, MEDIUM MAY HAVE CHANGED|
| 5Ah 01h DT WR OM OPERATOR MEDIUM REMOVAL REQUEST |
| 5Ah 00h DTLPWRSOM OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED) |
| 5Ah 03h DT W O OPERATOR SELECTED WRITE PERMIT |
| 5Ah 02h DT W O OPERATOR SELECTED WRITE PROTECT |
| 61h 02h S OUT OF FOCUS |
| 4Eh 00h DTLPWRSOMC OVERLAPPED COMMANDS ATTEMPTED |
| 2Dh 00h T OVERWRITE ERROR ON UPDATE IN PLACE |
| 3Bh 05h L PAPER JAM |
| 1Ah 00h DTLPWRSOMC PARAMETER LIST LENGTH ERROR |
| 26h 01h DTLPWRSOMC PARAMETER NOT SUPPORTED |
| 26h 02h DTLPWRSOMC PARAMETER VALUE INVALID |
| 2Ah 00h DTL WRSOMC PARAMETERS CHANGED |
| 03h 00h DTL W SO PERIPHERAL DEVICE WRITE FAULT |
| 50h 02h T POSITION ERROR RELATED TO TIMING |
| 3Bh 0Ch S POSITION PAST BEGINNING OF MEDIUM |
| 3Bh 0Bh S POSITION PAST END OF MEDIUM |
| 15h 02h DT WR O POSITIONING ERROR DETECTED BY READ OF MEDIUM |
| 29h 00h DTLPWRSOMC POWER ON, RESET, OR BUS DEVICE RESET OCCURRED |
| 42h 00h D POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN) |
| 1Ch 01h D O PRIMARY DEFECT LIST NOT FOUND |
| 40h 00h D RAM FAILURE (SHOULD USE 40 NN) |
| 15h 00h DTL WRSOM RANDOM POSITIONING ERROR |
| 3Bh 0Ah S READ PAST BEGINNING OF MEDIUM |
| 3Bh 09h S READ PAST END OF MEDIUM |
| 11h 01h DT W SO READ RETRIES EXHAUSTED |
| 14h 01h DT WR O RECORD NOT FOUND |
| 14h 00h DTL WRSO RECORDED ENTITY NOT FOUND |
| 18h 02h D WR O RECOVERED DATA - DATA AUTO-REALLOCATED |
| 18h 05h D WR O RECOVERED DATA - RECOMMEND REASSIGNMENT |
| 18h 06h D WR O RECOVERED DATA - RECOMMEND REWRITE |
| 17h 05h D WR O RECOVERED DATA USING PREVIOUS SECTOR ID |
| 18h 03h R RECOVERED DATA WITH CIRC |
| 18h 01h D WR O RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED|
| 18h 00h DT WR O RECOVERED DATA WITH ERROR CORRECTION APPLIED |
| 18h 04h R RECOVERED DATA WITH L-EC |
| 17h 03h DT WR O RECOVERED DATA WITH NEGATIVE HEAD OFFSET |
| 17h 00h DT WRSO RECOVERED DATA WITH NO ERROR CORRECTION APPLIED |
| 17h 02h DT WR O RECOVERED DATA WITH POSITIVE HEAD OFFSET |
| 17h 01h DT WRSO RECOVERED DATA WITH RETRIES |
| 17h 04h WR O RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED |
| 17h 06h D W O RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED |
| 17h 07h D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT |
| 17h 08h D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE |
| 1Eh 00h D W O RECOVERED ID WITH ECC CORRECTION |
| 3Bh 08h T REPOSITION ERROR |
| 36h 00h L RIBBON, INK, OR TONER FAILURE |
| 37h 00h DTL WRSOMC ROUNDED PARAMETER |
| 5Ch 00h D O RPL STATUS CHANGE |
| 39h 00h DTL WRSOMC SAVING PARAMETERS NOT SUPPORTED |
| 62h 00h S SCAN HEAD POSITIONING ERROR |
| 47h 00h DTLPWRSOMC SCSI PARITY ERROR |
| 54h 00h P SCSI TO HOST SYSTEM INTERFACE FAILURE |
| 45h 00h DTLPWRSOMC SELECT OR RESELECT FAILURE |
+=============================================================================+
Table 71: (concluded)
+=============================================================================+
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 3Bh 00h TL SEQUENTIAL POSITIONING ERROR |
| 00h 03h T SETMARK DETECTED |
| 3Bh 04h L SLEW FAILURE |
| 09h 03h WR O SPINDLE SERVO FAILURE |
| 5Ch 02h D O SPINDLES NOT SYNCHRONIZED |
| 5Ch 01h D O SPINDLES SYNCHRONIZED |
| 1Bh 00h DTLPWRSOMC SYNCHRONOUS DATA TRANSFER ERROR |
| 55h 00h P SYSTEM RESOURCE FAILURE |
| 33h 00h T TAPE LENGTH ERROR |
| 3Bh 03h L TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY |
| 3Bh 01h T TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM |
| 3Bh 02h T TAPE POSITION ERROR AT END-OF-MEDIUM |
| 3Fh 00h DTLPWRSOMC TARGET OPERATING CONDITIONS HAVE CHANGED |
| 5Bh 01h DTLPWRSOM THRESHOLD CONDITION MET |
| 26h 03h DTLPWRSOMC THRESHOLD PARAMETERS NOT SUPPORTED |
| 2Ch 01h S TOO MANY WINDOWS SPECIFIED |
| 09h 00h DT WR O TRACK FOLLOWING ERROR |
| 09h 01h WR O TRACKING SERVO FAILURE |
| 61h 01h S UNABLE TO ACQUIRE VIDEO |
| 57h 00h R UNABLE TO RECOVER TABLE-OF-CONTENTS |
| 53h 01h T UNLOAD TAPE FAILURE |
| 11h 00h DT WRSO UNRECOVERED READ ERROR |
| 11h 04h D W O UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED |
| 11h 0Bh D W O UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT |
| 11h 0Ch D W O UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA |
| 46h 00h DTLPWRSOMC UNSUCCESSFUL SOFT RESET |
| 59h 00h O UPDATED BLOCK READ |
| 61h 00h S VIDEO ACQUISITION ERROR |
| 50h 00h T WRITE APPEND ERROR |
| 50h 01h T WRITE APPEND POSITION ERROR |
| 0Ch 00h T S WRITE ERROR |
| 0Ch 02h D W O WRITE ERROR - AUTO REALLOCATION FAILED |
| 0Ch 01h D W O WRITE ERROR RECOVERED WITH AUTO REALLOCATION |
| 27h 00h DT W O WRITE PROTECTED |
| |
| 80h XXh \ |
| THROUGH > VENDOR SPECIFIC. |
| FFh XX / |
| |
| XXh 80h \ |
| THROUGH > VENDOR SPECIFIC QUALIFICATION OF STANDARD ASC. |
| XXh FFh / |
| ALL CODES NOT SHOWN ARE RESERVED. |
|-----------------------------------------------------------------------------|
V.2. ASC and ASCQ(�ԍ���)
Table 364: ASC and ASCQ Assignments
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 00 00 DTLPWRSOMC NO ADDITIONAL SENSE INFORMATION |
| 00 01 T FILEMARK DETECTED |
| 00 02 T S END-OF-PARTITION/MEDIUM DETECTED |
| 00 03 T SETMARK DETECTED |
| 00 04 T S BEGINNING-OF-PARTITION/MEDIUM DETECTED |
| 00 05 T S END-OF-DATA DETECTED |
| 00 06 DTLPWRSOMC I/O PROCESS TERMINATED |
| 00 11 R AUDIO PLAY OPERATION IN PROGRESS |
| 00 12 R AUDIO PLAY OPERATION PAUSED |
| 00 13 R AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED |
| 00 14 R AUDIO PLAY OPERATION STOPPED DUE TO ERROR |
| 00 15 R NO CURRENT AUDIO STATUS TO RETURN |
| 01 00 DW O NO INDEX/SECTOR SIGNAL |
| 02 00 DWR OM NO SEEK COMPLETE |
| 03 00 DTL W SO PERIPHERAL DEVICE WRITE FAULT |
| 03 01 T NO WRITE CURRENT |
| 03 02 T EXCESSIVE WRITE ERRORS |
| 04 00 DTLPWRSOMC LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE |
| 04 01 DTLPWRSOMC LOGICAL UNIT IS IN PROCESS OF BECOMING READY |
| 04 02 DTLPWRSOMC LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED |
| 04 03 DTLPWRSOMC LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED |
| 04 04 DTL O LOGICAL UNIT NOT READY, FORMAT IN PROGRESS |
| 05 00 DTL WRSOMC LOGICAL UNIT DOES NOT RESPOND TO SELECTION |
| 06 00 DWR OM NO REFERENCE POSITION FOUND |
| 07 00 DTL WRSOM MULTIPLE PERIPHERAL DEVICES SELECTED |
| 08 00 DTL WRSOMC LOGICAL UNIT COMMUNICATION FAILURE |
| 08 01 DTL WRSOMC LOGICAL UNIT COMMUNICATION TIME-OUT |
| 08 02 DTL WRSOMC LOGICAL UNIT COMMUNICATION PARITY ERROR |
| 09 00 DT WR O TRACK FOLLOWING ERROR |
| 09 01 WR O TRA CKING SERVO FAILURE |
| 09 02 WR O FOC US SERVO FAILURE |
| 09 03 WR O SPI NDLE SERVO FAILURE |
+=============================================================================+
Table 364: (continued)
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 0A 00 DTLPWRSOMC ERROR LOG OVERFLOW |
| 0B 00 |
| 0C 00 T S WRITE ERROR |
| 0C 01 D W O WRITE ERROR RECOVERED WITH AUTO REALLOCATION |
| 0C 02 D W O WRITE ERROR - AUTO REALLOCATION FAILED |
| 0D 00 |
| 0E 00 |
| 0F 00 |
| 10 00 D W O ID CRC OR ECC ERROR |
| 11 00 DT WRSO UNRECOVERED READ ERROR |
| 11 01 DT W SO READ RETRIES EXHAUSTED |
| 11 02 DT W SO ERROR TOO LONG TO CORRECT |
| 11 03 DT W SO MULTIPLE READ ERRORS |
| 11 04 D W O UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED |
| 11 05 WR O L-EC UNCORRECTABLE ERROR |
| 11 06 WR O CIRC UNRECOVERED ERROR |
| 11 07 W O DATA RESYCHRONIZATION ERROR |
| 11 08 T INCOMPLETE BLOCK READ |
| 11 09 T NO GAP FOUND |
| 11 0A DT O MISCORRECTED ERROR |
| 11 0B D W O UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT |
| 11 0C D W O UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA |
| 12 00 D W O ADDRESS MARK NOT FOUND FOR ID FIELD |
| 13 00 D W O ADDRESS MARK NOT FOUND FOR DATA FIELD |
| 14 00 DTL WRSO RECORDED ENTITY NOT FOUND |
| 14 01 DT WR O RECORD NOT FOUND |
| 14 02 T FILEMARK OR SETMARK NOT FOUND |
| 14 03 T END-OF-DATA NOT FOUND |
| 14 04 T BLOCK SEQUENCE ERROR |
| 15 00 DTL WRSOM RANDOM POSITIONING ERROR |
| 15 01 DTL WRSOM MECHANICAL POSITIONING ERROR |
| 15 02 DT WR O POSITIONING ERROR DETECTED BY READ OF MEDIUM |
| 16 00 DW O DATA SYNCHRONIZATION MARK ERROR |
| 17 00 DT WRSO RECOVERED DATA WITH NO ERROR CORRECTION APPLIED |
| 17 01 DT WRSO RECOVERED DATA WITH RETRIES |
| 17 02 DT WR O RECOVERED DATA WITH POSITIVE HEAD OFFSET |
| 17 03 DT WR O RECOVERED DATA WITH NEGATIVE HEAD OFFSET |
| 17 04 WR O RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED |
| 17 05 D WR O RECOVERED DATA USING PREVIOUS SECTOR ID |
| 17 06 D W O RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED |
| 17 07 D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT |
| 17 08 D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE |
| 18 00 DT WR O RECOVERED DATA WITH ERROR CORRECTION APPLIED |
| 18 01 D WR O RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED|
| 18 02 D WR O RECOVERED DATA - DATA AUTO-REALLOCATED |
| 18 03 R RECOVERED DATA WITH CIRC |
| 18 04 R RECOVERED DATA WITH LEC |
| 18 05 D WR O RECOVERED DATA - RECOMMEND REASSIGNMENT |
| 18 06 D WR O RECOVERED DATA - RECOMMEND REWRITE |
+=============================================================================+
Table 364: (continued)
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 19 00 D O DEFECT LIST ERROR |
| 19 01 D O DEFECT LIST NOT AVAILABLE |
| 19 02 D O DEFECT LIST ERROR IN PRIMARY LIST |
| 19 03 D O DEFECT LIST ERROR IN GROWN LIST |
| 1A 00 DTLPWRSOMC PARAMETER LIST LENGTH ERROR |
| 1B 00 DTLPWRSOMC SYNCHRONOUS DATA TRANSFER ERROR |
| 1C 00 D O DEFECT LIST NOT FOUND |
| 1C 01 D O PRIMARY DEFECT LIST NOT FOUND |
| 1C 02 D O GROWN DEFECT LIST NOT FOUND |
| 1D 00 D W O MISCOMPARE DURING VERIFY OPERATION |
| 1E 00 D W O RECOVERED ID WITH ECC |
| 1F 00 |
| 20 00 DTLPWRSOMC INVALID COMMAND OPERATION CODE |
| 21 00 DT WR OM LOGICAL BLOCK ADDRESS OUT OF RANGE |
| 21 01 M INVALID ELEMENT ADDRESS |
| 22 00 D ILLEGAL FUNCTION (SHOULD USE 20 00, 24 00, OR 26 00) |
| 23 00 |
| 24 00 DTLPWRSOMC INVALID FIELD IN CDB |
| 25 00 DTLPWRSOMC LOGICAL UNIT NOT SUPPORTED |
| 26 00 DTLPWRSOMC INVALID FIELD IN PARAMETER LIST |
| 26 01 DTLPWRSOMC PARAMETER NOT SUPPORTED |
| 26 02 DTLPWRSOMC PARAMETER VALUE INVALID |
| 26 03 DTLPWRSOMC THRESHOLD PARAMETERS NOT SUPPORTED |
| 27 00 DT W O WRITE PROTECTED |
| 28 00 DTLPWRSOMC NOT READY TO READY TRANSITION(MEDIUM MAY HAVE CHANGED)|
| 28 01 M IMPORT OR EXPORT ELEMENT ACCESSED |
| 29 00 DTLPWRSOMC POWER ON, RESET, OR BUS DEVICE RESET OCCURRED |
| 2A 00 DTL WRSOMC PARAMETERS CHANGED |
| 2A 01 DTL WRSOMC MODE PARAMETERS CHANGED |
| 2A 02 DTL WRSOMC LOG PARAMETERS CHANGED |
| 2B 00 DTLPWRSO C COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT |
| 2C 00 DTLPWRSOMC COMMAND SEQUENCE ERROR |
| 2C 01 S TOO MANY WINDOWS SPECIFIED |
| 2C 02 S INVALID COMBINATION OF WINDOWS SPECIFIED |
| 2D 00 T OVERWRITE ERROR ON UPDATE IN PLACE |
| 2E 00 |
| 2F 00 DTLPWRSOMC COMMANDS CLEARED BY ANOTHER INITIATOR |
| 30 00 DT WR OM INCOMPATIBLE MEDIUM INSTALLED |
| 30 01 DT WR O CANNOT READ MEDIUM - UNKNOWN FORMAT |
| 30 02 DT WR O CANNOT READ MEDIUM - INCOMPATIBLE FORMAT |
| 30 03 DT CLEANING CARTRIDGE INSTALLED |
| 31 00 DT W O MEDIUM FORMAT CORRUPTED |
| 31 01 D L O FORMAT COMMAND FAILED |
| 32 00 D W O NO DEFECT SPARE LOCATION AVAILABLE |
| 32 01 D W O DEFECT LIST UPDATE FAILURE |
| 33 00 T TAPE LENGTH ERROR |
| 34 00 |
| 35 00 |
| 36 00 L RIBBON, INK, OR TONER FAILURE |
+=============================================================================+
Table 364: (continued)
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 37 00 DTL WRSOMC ROUNDED PARAMETER |
| 38 00 |
| 39 00 DTL WRSOMC SAVING PARAMETERS NOT SUPPORTED |
| 3A 00 DTL WRSOM MEDIUM NOT PRESENT |
| 3B 00 TL SEQUENTIAL POSITIONING ERROR |
| 3B 01 T TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM |
| 3B 02 T TAPE POSITION ERROR AT END-OF-MEDIUM |
| 3B 03 L TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY |
| 3B 04 L SLEW FAILURE |
| 3B 05 L PAPER JAM |
| 3B 06 L FAILED TO SENSE TOP-OF-FORM |
| 3B 07 L FAILED TO SENSE BOTTOM-OF-FORM |
| 3B 08 T REPOSITION ERROR |
| 3B 09 S READ PAST END OF MEDIUM |
| 3B 0A S READ PAST BEGINNING OF MEDIUM |
| 3B 0B S POSITION PAST END OF MEDIUM |
| 3B 0C S POSITION PAST BEGINNING OF MEDIUM |
| 3B 0D M MEDIUM DESTINATION ELEMENT FULL |
| 3B 0E M MEDIUM SOURCE ELEMENT EMPTY |
| 3C 00 |
| 3D 00 DTLPWRSOMC INVALID BITS IN IDENTIFY MESSAGE |
| 3E 00 DTLPWRSOMC LOGICAL UNIT HAS NOT SELF-CONFIGURED YET |
| 3F 00 DTLPWRSOMC TARGET OPERATING CONDITIONS HAVE CHANGED |
| 3F 01 DTLPWRSOMC MICROCODE HAS BEEN CHANGED |
| 3F 02 DTLPWRSOMC CHANGED OPERATING DEFINITION |
| 3F 03 DTLPWRSOMC INQUIRY DATA HAS CHANGED |
| 40 00 D RAM FAILURE (SHOULD USE 40 NN) |
| 40 NN DTLPWRSOMC DIAGNOSTIC FAILURE ON COMPONENT NN (80H-FFH) |
| 41 00 D DATA PATH FAILURE (SHOULD USE 40 NN) |
| 42 00 D POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN) |
| 43 00 DTLPWRSOMC MESSAGE ERROR |
| 44 00 DTLPWRSOMC INTERNAL TARGET FAILURE |
| 45 00 DTLPWRSOMC SELECT OR RESELECT FAILURE |
| 46 00 DTLPWRSOMC UNSUCCESSFUL SOFT RESET |
| 47 00 DTLPWRSOMC SCSI PARITY ERROR |
| 48 00 DTLPWRSOMC INITIATOR DETECTED ERROR MESSAGE RECEIVED |
| 49 00 DTLPWRSOMC INVALID MESSAGE ERROR |
| 4A 00 DTLPWRSOMC COMMAND PHASE ERROR |
| 4B 00 DTLPWRSOMC DATA PHASE ERROR |
| 4C 00 DTLPWRSOMC LOGICAL UNIT FAILED SELF-CONFIGURATION |
| 4D 00 |
| 4E 00 DTLPWRSOMC OVERLAPPED COMMANDS ATTEMPTED |
| 4F 00 |
| 50 00 T WRITE APPEND ERROR |
| 50 01 T WRITE APPEND POSITION ERROR |
| 50 02 T POSITION ERROR RELATED TO TIMING |
| 51 00 T O ERASE FAILURE |
| 52 00 T CARTRIDGE FAULT |
+=============================================================================+
Table 364: (continued)
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 53 00 DTL WRSOM MEDIA LOAD OR EJECT FAILED |
| 53 01 T UNLOAD TAPE FAILURE |
| 53 02 DT WR OM MEDIUM REMOVAL PREVENTED |
| 54 00 P SCSI TO HOST SYSTEM INTERFACE FAILURE |
| 55 00 P SYSTEM RESOURCE FAILURE |
| 56 00 |
| 57 00 R UNABLE TO RECOVER TABLE-OF-CONTENTS |
| 58 00 O GENERATION DOES NOT EXIST |
| 59 00 O UPDATED BLOCK READ |
| 5A 00 DTLPWRSOM OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED) |
| 5A 01 DT WR OM OPERATOR MEDIUM REMOVAL REQUEST |
| 5A 02 DT W O OPERATOR SELECTED WRITE PROTECT |
| 5A 03 DT W O OPERATOR SELECTED WRITE PERMIT |
| 5B 00 DTLPWRSOM LOG EXCEPTION |
| 5B 01 DTLPWRSOM THRESHOLD CONDITION MET |
| 5B 02 DTLPWRSOM LOG COUNTER AT MAXIMUM |
| 5B 03 DTLPWRSOM LOG LIST CODES EXHAUSTED |
| 5C 00 D O RPL STATUS CHANGE |
| 5C 01 D O SPINDLES SYNCHRONIZED |
| 5C 02 D O SPINDLES NOT SYNCHRONIZED |
| 5D 00 |
| 5E 00 |
| 5F 00 |
| 60 00 S LAMP FAILURE |
| 61 00 S VIDEO ACQUISITION ERROR |
| 61 01 S UNABLE TO ACQUIRE VIDEO |
| 61 02 S OUT OF FOCUS |
| 62 00 S SCAN HEAD POSITIONING ERROR |
| 63 00 R END OF USER AREA ENCOUNTERED ON THIS TRACK |
| 64 00 R ILLEGAL MODE FOR THIS TRACK |
| 65 00 |
| 66 00 |
| 67 00 |
| 68 00 |
| 69 00 |
| 6A 00 |
| 6B 00 |
| 6C 00 |
| 6D 00 |
| 6E 00 |
| 6F 00 |
+=============================================================================+
Table 364: (concluded)
+=============================================================================+
| D - DIRECT ACCESS DEVICE |
| .T - SEQUENTIAL ACCESS DEVICE |
| . L - PRINTER DEVICE |
| . P - PROCESSOR DEVICE |
| . .W - WRITE ONCE READ MULTIPLE DEVICE |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| ASC ASCQ DTLPWRSOMC DESCRIPTION |
| --- ---- ----------------------------------------------------- |
| 70 00 |
| 71 00 |
| 72 00 |
| 73 00 |
| 74 00 |
| 75 00 |
| 76 00 |
| 77 00 |
| 78 00 |
| 79 00 |
| 7A 00 |
| 7B 00 |
| 7C 00 |
| 7D 00 |
| 7E 00 |
| 7F 00 |
| |
| 80 xxh \ |
| THROUGH > VENDOR SPECIFIC. |
| FF xxh / |
| |
| xxh 80 \ |
| THROUGH > VENDOR SPECIFIC QUALIFICATION OF STANDARD ASC. |
| xxh FF / |
| ALL CODES NOT SHOWN OR BLANK ARE RESERVED. |
+=============================================================================+
W. SCSI�R�}���h�R�[�h�̃N�C�b�N���t�@�����X
�\365�̓R�}���h����R�[�h�̔ԍ����̖ژ^�ł��B
Table 365: SCSI-2 Operation Codes
+=============================================================================+
| D - DIRECT ACCESS DEVICE Device Column Key |
| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
| . L - PRINTER DEVICE O = Optional |
| . P - PROCESSOR DEVICE V = Vendor Specific|
| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| OP DTLPWRSOMC Description |
|----------+----------+-------------------------------------------------------|
| 00 MMMMMMMMMM TEST UNIT READY |
| 01 M REWIND |
| 01 O V OO OO REZERO UNIT |
| 02 VVVVVV V |
| 03 MMMMMMMMMM REQUEST SENSE |
| 04 O FORMAT |
| 04 M O FORMAT UNIT |
| 05 VMVVVV V READ BLOCK LIMITS |
| 06 VVVVVV V |
| 07 O INITIALIZE ELEMENT STATUS |
| 07 OVV O OV REASSIGN BLOCKS |
| 08 M GET MESSAGE(06) |
| 08 OMV OO OV READ(06) |
| 08 O RECEIVE |
| 09 VVVVVV V |
| 0A M PRINT |
| 0A M SEND MESSAGE(06) |
| 0A M SEND(06) |
| 0A OM O OV WRITE(06) |
| 0B O OO OV SEEK(06) |
| 0B O SLEW AND PRINT |
| 0C VVVVVV V |
| 0D VVVVVV V |
| 0E VVVVVV V |
| 0F VOVVVV V READ REVERSE |
| 10 O O SYNCHRONIZE BUFFER |
| 10 VM VVV WRITE FILEMARKS |
| 11 VMVVVV SPACE |
| 12 MMMMMMMMMM INQUIRY |
| 13 VOVVVV VERIFY(06) |
| 14 VOOVVV RECOVER BUFFERED DATA |
| 15 OMO OOOOOO MODE SELECT(06) |
| 16 M MM MO RESERVE |
| 16 MM M RESERVE UNIT |
| 17 M MM MO RELEASE |
| 17 MM M RELEASE UNIT |
| 18 OOOOOOOO COPY |
| 19 VMVVVV ERASE |
| 1A OMO OOOOOO MODE SENSE(06) |
| 1B O LOAD UNLOAD |
| 1B O SCAN |
| 1B O STOP PRINT |
| 1B O OO O STOP START UNIT |
+=============================================================================+
Table 365: (continued)
+=============================================================================+
| D - DIRECT ACCESS DEVICE Device Column Key |
| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
| . L - PRINTER DEVICE O = Optional |
| . P - PROCESSOR DEVICE V = Vendor Specific|
| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| OP DTLPWRSOMC Description |
|----------+----------+-------------------------------------------------------|
| 1C OOOOOOOOOO RECEIVE DIAGNOSTIC RESULTS |
| 1D MMMMMMMMMM SEND DIAGNOSTIC |
| 1E OO OO OO PREVENT ALLOW MEDIUM REMOVAL |
| 1F |
| 20 V VV V |
| 21 V VV V |
| 22 V VV V |
| 23 V VV V |
| 24 V VVM SET WINDOW |
| 25 O GET WINDOW |
| 25 M M M READ CAPACITY |
| 25 M READ CD-ROM CAPACITY |
| 26 V VV |
| 27 V VV |
| 28 O GET MESSAGE(10) |
| 28 M MMMM READ(10) |
| 29 V VV O READ GENERATION |
| 2A O SEND MESSAGE(10) |
| 2A O SEND(10) |
| 2A M M M WRITE(10) |
| 2B O LOCATE |
| 2B O POSITION TO ELEMENT |
| 2B O OO O SEEK(10) |
| 2C V O ERASE(10) |
| 2D V O O READ UPDATED BLOCK |
| 2E O O O WRITE AND VERIFY(10) |
| 2F O OO O VERIFY(10) |
| 30 O OO O SEARCH DATA HIGH(10) |
| 31 O OBJECT POSITION |
| 31 O OO O SEARCH DATA EQUAL(10) |
| 32 O OO O SEARCH DATA LOW(10) |
| 33 O OO O SET LIMITS(10) |
| 34 O GET DATA BUFFER STATUS |
| 34 O OO O PRE-FETCH |
| 34 O READ POSITION |
| 35 O OO O SYNCHRONIZE CACHE |
| 36 O OO O LOCK UNLOCK CACHE |
| 37 O O READ DEFECT DATA(10) |
| 38 O O MEDIUM SCAN |
| 39 OOOOOOOO COMPARE |
| 3A OOOOOOOO COPY AND VERIFY |
| 3B OOOOOOOOOO WRITE BUFFER |
| 3C OOOOOOOOOO READ BUFFER |
| 3D O O UPDATE BLOCK |
| 3E O OO O READ LONG |
| 3F O O O WRITE LONG |
+=============================================================================+
Table 365: (continued)
+=============================================================================+
| D - DIRECT ACCESS DEVICE Device Column Key |
| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
| . L - PRINTER DEVICE O = Optional |
| . P - PROCESSOR DEVICE V = Vendor Specific|
| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| OP DTLPWRSOMC Description |
|----------+----------+-------------------------------------------------------|
| 40 OOOOOOOOOO CHANGE DEFINITION |
| 41 O WRITE SAME |
| 42 O READ SUB-CHANNEL |
| 43 O READ TOC |
| 44 O READ HEADER |
| 45 O PLAY AUDIO(10) |
| 46 |
| 47 O PLAY AUDIO MSF |
| 48 O PLAY AUDIO TRACK INDEX |
| 49 O PLAY TRACK RELATIVE(10) |
| 4A |
| 4B O PAUSE RESUME |
| 4C OOOOOOOOOO LOG SELECT |
| 4D OOOOOOOOOO LOG SENSE |
| 4E |
| 4F |
| 50 |
| 51 |
| 52 |
| 53 |
| 54 |
| 55 OOO OOOOOO MODE SELECT(10) |
| 56 |
| 57 |
| 58 |
| 59 |
| 5A OOO OOOOOO MODE SENSE(10) |
| 5B |
| 5C |
| 5D |
| 5E |
| 5F |
+=============================================================================+
Table 365: (concluded)
+=============================================================================+
| D - DIRECT ACCESS DEVICE Device Column Key |
| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
| . L - PRINTER DEVICE O = Optional |
| . P - PROCESSOR DEVICE V = Vendor Specific|
| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
| . . R - READ ONLY (CD-ROM) DEVICE |
| . . S - SCANNER DEVICE |
| . . .O - OPTICAL MEMORY DEVICE |
| . . . M - MEDIA CHANGER DEVICE |
| . . . C - COMMUNICATION DEVICE |
| . . . . |
| OP DTLPWRSOMC Description |
|----------+----------+-------------------------------------------------------|
| A0 |
| A1 |
| A2 |
| A3 |
| A4 |
| A5 M MOVE MEDIUM |
| A5 O PLAY AUDIO(12) |
| A6 O EXCHANGE MEDIUM |
| A7 |
| A8 O GET MESSAGE(12) |
| A8 OO O READ(12) |
| A9 O PLAY TRACK RELATIVE(12) |
| AA O SEND MESSAGE(12) |
| AA O O WRITE(12) |
| AB |
| AC O ERASE(12) |
| AD |
| AE O O WRITE AND VERIFY(12) |
| AF OO O VERIFY(12) |
| B0 OO O SEARCH DATA HIGH(12) |
| B1 OO O SEARCH DATA EQUAL(12) |
| B2 OO O SEARCH DATA LOW(12) |
| B3 OO O SET LIMITS(12) |
| B4 |
| B5 |
| B5 O REQUEST VOLUME ELEMENT ADDRESS |
| B6 |
| B6 O SEND VOLUME TAG |
| B7 O READ DEFECT DATA(12) |
| B8 |
| B8 O READ ELEMENT STATUS |
| B9 |
| BA |
| BB |
| BC |
| BD |
| BE |
| BF |
+=============================================================================+
X. �v���O������
���ꂪ C ����ɂ��v���O������ł��B����͐�����/���f����v�����A��
�f�B�A�����u�ɓ��ڂ���Ă��邩�ǂ�������܂��B
#define DEVICE "/dev/sgc"
/* �ėp SCSI �C���^�[�t�F�[�X��ۂɓ������Ă݂錩�{�v���O���� */
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <scsi/sg.h>
#define SCSI_OFF sizeof(struct sg_header)
static unsigned char cmd[SCSI_OFF + 18]; /* SCSI �R�}���h �o�b�t�@ */
int fd; /* SCSI �f�o�C�X/�t�@�C�� �f�B�X�N���v�^ */
/* �������� SCSI �R�}���h����B �ėp SCSI �C���^�[�t�F�[�X��g�p */
static int handle_scsi_cmd(unsigned cmd_len, /* �R�}���h�� */
unsigned in_size, /* ���̓f�[�^�T�C�Y */
unsigned char *i_buff, /* ���̓o�b�t�@ */
unsigned out_size, /* �o�̓f�[�^�T�C�Y */
unsigned char *o_buff /* �o�̓o�b�t�@ */
)
{
int status = 0;
struct sg_header *sg_hd;
/* ���S������ */
if (!cmd_len) return -1; /* cmd_len != 0 ���K�v */
if (!i_buff) return -1; /* ���̓o�b�t�@�� NULL �łȂ����� */
#ifdef SG_BIG_BUFF
if (SCSI_OFF + cmd_len + in_size > SG_BIG_BUFF) return -1;
if (SCSI_OFF + out_size > SG_BIG_BUFF) return -1;
#else
if (SCSI_OFF + cmd_len + in_size > 4096) return -1;
if (SCSI_OFF + out_size > 4096) return -1;
#endif
if (!o_buff) out_size = 0;
/* �ėp SCSI �f�o�C�X�w�b�_�̍\�z */
sg_hd = (struct sg_header *) i_buff;
sg_hd->reply_len = SCSI_OFF + out_size;
sg_hd->twelve_byte = cmd_len == 12;
sg_hd->result = 0;
#if 0
sg_hd->pack_len = SCSI_OFF + cmd_len + in_size; /* �s�v */
sg_hd->pack_id; /* ���g�p */
sg_hd->other_flags; /* ���g�p */
#endif
/* �R�}���h���o */
status = write( fd, i_buff, SCSI_OFF + cmd_len + in_size );
if ( status < 0 || status != SCSI_OFF + cmd_len + in_size ||
sg_hd->result ) {
/* �Ȃ�炩�̃G���[������ */
fprintf( stderr, "write(generic) result = 0x%x cmd = 0x%x\n",
sg_hd->result, i_buff[SCSI_OFF] );
perror("");
return status;
}
if (!o_buff) o_buff = i_buff; /* �o�b�t�@�̃|�C���^��`�F�b�N */
/* ���ʂ�� */
status = read( fd, o_buff, SCSI_OFF + out_size);
if ( status < 0 || status != SCSI_OFF + out_size || sg_hd->result ) {
/* �Ȃ�炩�̃G���[������ */
fprintf( stderr, "read(generic) result = 0x%x cmd = 0x%x\n",
sg_hd->result, o_buff[SCSI_OFF] );
fprintf( stderr, "read(generic) sense "
"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
sg_hd->sense_buffer[0], sg_hd->sense_buffer[1],
sg_hd->sense_buffer[2], sg_hd->sense_buffer[3],
sg_hd->sense_buffer[4], sg_hd->sense_buffer[5],
sg_hd->sense_buffer[6], sg_hd->sense_buffer[7],
sg_hd->sense_buffer[8], sg_hd->sense_buffer[9],
sg_hd->sense_buffer[10], sg_hd->sense_buffer[11],
sg_hd->sense_buffer[12], sg_hd->sense_buffer[13],
sg_hd->sense_buffer[14], sg_hd->sense_buffer[15]);
if (status < 0)
perror("");
}
/* ���ׂ���̂�������ǂ�����݂� */
if (status == SCSI_OFF + out_size) status = 0; /* �S������� */
return status; /* 0 �̓G���[�Ȃ���Ӗ� */
}
#define INQUIRY_CMD 0x12
#define INQUIRY_CMDLEN 6
#define INQUIRY_REPLY_LEN 96
#define INQUIRY_VENDOR 8 /* �ԓ��f�[�^��̃x���_���̃I�t�Z�b�g */
/* �x���_�̃u�����h�ƃ��f����v�� */
static unsigned char *Inquiry ( void )
{
static unsigned char Inqbuffer[ SCSI_OFF + INQUIRY_REPLY_LEN ];
unsigned char cmdblk [ INQUIRY_CMDLEN ] =
{ INQUIRY_CMD, /* command */
0, /* lun/reserved */
0, /* page code */
0, /* reserved */
INQUIRY_REPLY_LEN, /* allocation length */
0 };/* reserved/flag/link */
memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
/*
* +------------------+
* | struct sg_header | <- cmd
* +------------------+
* | copy of cmdblk | <- cmd + SCSI_OFF
* +------------------+
*/
if (handle_scsi_cmd(sizeof(cmdblk), 0, cmd,
sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
fprintf( stderr, "Inquiry failed\n" );
exit(2);
}
return (Inqbuffer + SCSI_OFF);
}
#define TESTUNITREADY_CMD 0
#define TESTUNITREADY_CMDLEN 6
#define ADD_SENSECODE 12
#define ADD_SC_QUALIFIER 13
#define NO_MEDIA_SC 0x3a
#define NO_MEDIA_SCQ 0x00
int TestForMedium ( void )
{
/* READY ��Ԃ�v�� */
static unsigned char cmdblk [TESTUNITREADY_CMDLEN] = {
TESTUNITREADY_CMD, /* command */
0, /* lun/reserved */
0, /* reserved */
0, /* reserved */
0, /* reserved */
0};/* reserved */
memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
/*
* +------------------+
* | struct sg_header | <- cmd
* +------------------+
* | copy of cmdblk | <- cmd + SCSI_OFF
* +------------------+
*/
if (handle_scsi_cmd(sizeof(cmdblk), 0, cmd,
0, NULL)) {
fprintf (stderr, "Test unit ready failed\n");
exit(2);
}
return
*(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) !=
NO_MEDIA_SC ||
*(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) !=
NO_MEDIA_SCQ;
}
void main( void )
{
fd = open(DEVICE, O_RDWR);
if (fd < 0) {
fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
exit(1);
}
/* Inquiry �̌��ʂ̈ꕔ�̃t�B�[���h��\�� */
printf( "%s\n", Inquiry() + INQUIRY_VENDOR );
/* ���f�B�A�����ڂ���Ă��邩�ǂ�����݂� */
if (!TestForMedium()) {
printf("device is unloaded\n");
} else {
printf("device is loaded\n");
}
}