DF-2491 / fix.diff
diff --git a/sys/dev/disk/nata/ata-lowlevel.c b/sys/dev/disk/nata/ata-lowlevel.c index 089a2ac2..1111111 100644 --- a/sys/dev/disk/nata/ata-lowlevel.c +++ b/sys/dev/disk/nata/ata-lowlevel.c @@ -771,14 +771,19 @@ if (atadev->flags & ATA_D_USE_CHS) { int heads, sectors; - if (atadev->param.atavalid & ATA_FLAG_54_58) { + if ((atadev->param.atavalid & ATA_FLAG_54_58) && + atadev->param.current_heads && atadev->param.current_sectors) { heads = atadev->param.current_heads; sectors = atadev->param.current_sectors; } - else { + else if (atadev->param.heads && atadev->param.sectors) { heads = atadev->param.heads; sectors = atadev->param.sectors; } + else { + heads = 16; /* sane fallback geometry */ + sectors = 63; + } ATA_IDX_OUTB(ch, ATA_SECTOR, (request->u.ata.lba % sectors)+1); ATA_IDX_OUTB(ch, ATA_CYL_LSB, |