diff options
Diffstat (limited to 'drivers/scsi/ide-scsi.c')
-rw-r--r-- | drivers/scsi/ide-scsi.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index d80c4c9d5a63..83f062ed9082 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -179,8 +179,18 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne | |||
179 | return; | 179 | return; |
180 | } | 180 | } |
181 | count = min(pc->sg->length - pc->b_count, bcount); | 181 | count = min(pc->sg->length - pc->b_count, bcount); |
182 | buf = page_address(pc->sg->page) + pc->sg->offset; | 182 | if (PageHighMem(pc->sg->page)) { |
183 | drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count); | 183 | unsigned long flags; |
184 | |||
185 | local_irq_save(flags); | ||
186 | buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset; | ||
187 | drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count); | ||
188 | kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); | ||
189 | local_irq_restore(flags); | ||
190 | } else { | ||
191 | buf = page_address(pc->sg->page) + pc->sg->offset; | ||
192 | drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, count); | ||
193 | } | ||
184 | bcount -= count; pc->b_count += count; | 194 | bcount -= count; pc->b_count += count; |
185 | if (pc->b_count == pc->sg->length) { | 195 | if (pc->b_count == pc->sg->length) { |
186 | pc->sg++; | 196 | pc->sg++; |
@@ -201,8 +211,18 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign | |||
201 | return; | 211 | return; |
202 | } | 212 | } |
203 | count = min(pc->sg->length - pc->b_count, bcount); | 213 | count = min(pc->sg->length - pc->b_count, bcount); |
204 | buf = page_address(pc->sg->page) + pc->sg->offset; | 214 | if (PageHighMem(pc->sg->page)) { |
205 | drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count); | 215 | unsigned long flags; |
216 | |||
217 | local_irq_save(flags); | ||
218 | buf = kmap_atomic(pc->sg->page, KM_IRQ0) + pc->sg->offset; | ||
219 | drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count); | ||
220 | kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); | ||
221 | local_irq_restore(flags); | ||
222 | } else { | ||
223 | buf = page_address(pc->sg->page) + pc->sg->offset; | ||
224 | drive->hwif->atapi_output_bytes(drive, buf + pc->b_count, count); | ||
225 | } | ||
206 | bcount -= count; pc->b_count += count; | 226 | bcount -= count; pc->b_count += count; |
207 | if (pc->b_count == pc->sg->length) { | 227 | if (pc->b_count == pc->sg->length) { |
208 | pc->sg++; | 228 | pc->sg++; |