|
@@ -179,8 +179,18 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne
|
|
|
return;
|
|
|
}
|
|
|
count = min(pc->sg->length - pc->b_count, bcount);
|
|
|
- buf = page_address(pc->sg->page) + pc->sg->offset;
|
|
|
- drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
|
|
|
+ if (PageHighMem(pc->sg->page)) {
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ local_irq_save(flags);
|
|
|
+ buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset;
|
|
|
+ drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
|
|
|
+ kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
|
|
|
+ local_irq_restore(flags);
|
|
|
+ } else {
|
|
|
+ buf = page_address(pc->sg->page) + pc->sg->offset;
|
|
|
+ drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count);
|
|
|
+ }
|
|
|
bcount -= count; pc->b_count += count;
|
|
|
if (pc->b_count == pc->sg->length) {
|
|
|
pc->sg++;
|
|
@@ -201,8 +211,18 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign
|
|
|
return;
|
|
|
}
|
|
|
count = min(pc->sg->length - pc->b_count, bcount);
|
|
|
- buf = page_address(pc->sg->page) + pc->sg->offset;
|
|
|
- drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
|
|
|
+ if (PageHighMem(pc->sg->page)) {
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ local_irq_save(flags);
|
|
|
+ buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset;
|
|
|
+ drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
|
|
|
+ kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
|
|
|
+ local_irq_restore(flags);
|
|
|
+ } else {
|
|
|
+ buf = page_address(pc->sg->page) + pc->sg->offset;
|
|
|
+ drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count);
|
|
|
+ }
|
|
|
bcount -= count; pc->b_count += count;
|
|
|
if (pc->b_count == pc->sg->length) {
|
|
|
pc->sg++;
|