LINUX.ORG.RU

ata linux pio mode


0

1

Программа, использующая механизм PIO для доступа к жесткому диску, подключенному с помощью интерфейса ATA. check_error() - постоянно устанавливает бит ошибки.

int get_ata_identity(u8 dev)
{
	int i = 0;
	if(hd_busy(dev) & TIMEOUT) return -1;
	if((dev == 0) || (dev == 2))
		OUT_P_B(0xA0,ATA_CURRENT(dev));
	if((dev == 1) || (dev == 3))
		OUT_P_B(0x10,ATA_CURRENT(dev));
	if(hd_ready(dev) == TIMEOUT) return -1;
	OUT_P_B(0xEC,ATA_STATUS(dev));
	if(check_error(dev)) return -1;
	for(; i < TIMEOUT; i++) if(hd_data_request(dev)) break;
	if(i == TIMEOUT) return -1;
	asm(
	"	cld			\n\t"
	"1:	inw %%dx, %%ax		\n\t"
	"	stosw			\n\t"
	"	decw %%cx		\n\t"
	"	jnz 1b			\n\t"
	::"D"(&DEV_ID(dev)), "d"(ATA_DATA(dev)),"c"(0x100));
	return 0;
}
И, собственно, одна из функций проверки (в данном случае, на ошибку)
int check_error(u8 dev)
{
	unsigned char a;

	IN_P_B(a,ATA_STATUS(dev));
	if (a & ERR) return 1;
	return 0;
}
Вопрос: в чем может быть проблема, ибо на другой машине все работает...

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.