if (lbaStart + sectors > this.maxSector) {
throw new IOException(errorSource + " beyond device sectors");
}
final IDEDevice dev = (IDEDevice) getDevice();
final IDEBus bus = (IDEBus) dev.getBus();
final int maxSectorCount = is48bit ? MAX_SECTOR_COUNT_48 : MAX_SECTOR_COUNT_28;
final boolean primary = dev.isPrimary();
final boolean master = dev.isMaster();
while (length > 0) {
final long partLbaStart = devOffset / SECTOR_SIZE;
final int partSectorCount = Math.min(length / SECTOR_SIZE, maxSectorCount);
final int partLength = partSectorCount * SECTOR_SIZE;
final IDERWSectorsCommand cmd = isWrite ?
new IDEWriteSectorsCommand(primary, master, is48bit, partLbaStart, partSectorCount, buf) :
new IDEReadSectorsCommand(primary, master, is48bit, partLbaStart, partSectorCount, buf);
try {
log.debug("bus.exAndWt" + (isWrite ? "W" : "R") + " dev=" + dev.getId() + " start=" + partLbaStart +
" sectors=" + partSectorCount + " len=" + partLength);
bus.executeAndWait(cmd, IDE_DATA_XFER_TIMEOUT);
} catch (InterruptedException ex) {
throw new IOException("IDE " + errorSource + " interrupted", ex);
} catch (TimeoutException ex) {
throw new InterruptedIOException("IDE timeout: " + ex.getMessage());
}