diff options
Diffstat (limited to 'drivers/scsi/ide-scsi.c')
| -rw-r--r-- | drivers/scsi/ide-scsi.c | 203 |
1 files changed, 90 insertions, 113 deletions
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 68e5c632c5d5..93c3fc20aa59 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
| @@ -60,31 +60,6 @@ | |||
| 60 | 60 | ||
| 61 | #define IDESCSI_DEBUG_LOG 0 | 61 | #define IDESCSI_DEBUG_LOG 0 |
| 62 | 62 | ||
| 63 | typedef struct idescsi_pc_s { | ||
| 64 | u8 c[12]; /* Actual packet bytes */ | ||
| 65 | int request_transfer; /* Bytes to transfer */ | ||
| 66 | int actually_transferred; /* Bytes actually transferred */ | ||
| 67 | int buffer_size; /* Size of our data buffer */ | ||
| 68 | struct request *rq; /* The corresponding request */ | ||
| 69 | u8 *buffer; /* Data buffer */ | ||
| 70 | u8 *current_position; /* Pointer into the above buffer */ | ||
| 71 | struct scatterlist *sg; /* Scatter gather table */ | ||
| 72 | unsigned int sg_cnt; /* Number of entries in sg */ | ||
| 73 | int b_count; /* Bytes transferred from current entry */ | ||
| 74 | struct scsi_cmnd *scsi_cmd; /* SCSI command */ | ||
| 75 | void (*done)(struct scsi_cmnd *); /* Scsi completion routine */ | ||
| 76 | unsigned long flags; /* Status/Action flags */ | ||
| 77 | unsigned long timeout; /* Command timeout */ | ||
| 78 | } idescsi_pc_t; | ||
| 79 | |||
| 80 | /* | ||
| 81 | * Packet command status bits. | ||
| 82 | */ | ||
| 83 | #define PC_DMA_IN_PROGRESS 0 /* 1 while DMA in progress */ | ||
| 84 | #define PC_WRITING 1 /* Data direction */ | ||
| 85 | #define PC_TIMEDOUT 3 /* command timed out */ | ||
| 86 | #define PC_DMA_OK 4 /* Use DMA */ | ||
| 87 | |||
| 88 | /* | 63 | /* |
| 89 | * SCSI command transformation layer | 64 | * SCSI command transformation layer |
| 90 | */ | 65 | */ |
| @@ -101,14 +76,15 @@ typedef struct ide_scsi_obj { | |||
| 101 | struct gendisk *disk; | 76 | struct gendisk *disk; |
| 102 | struct Scsi_Host *host; | 77 | struct Scsi_Host *host; |
| 103 | 78 | ||
| 104 | idescsi_pc_t *pc; /* Current packet command */ | 79 | struct ide_atapi_pc *pc; /* Current packet command */ |
| 105 | unsigned long flags; /* Status/Action flags */ | 80 | unsigned long flags; /* Status/Action flags */ |
| 106 | unsigned long transform; /* SCSI cmd translation layer */ | 81 | unsigned long transform; /* SCSI cmd translation layer */ |
| 107 | unsigned long log; /* log flags */ | 82 | unsigned long log; /* log flags */ |
| 108 | } idescsi_scsi_t; | 83 | } idescsi_scsi_t; |
| 109 | 84 | ||
| 110 | static DEFINE_MUTEX(idescsi_ref_mutex); | 85 | static DEFINE_MUTEX(idescsi_ref_mutex); |
| 111 | static int idescsi_nocd; /* Set by module param to skip cd */ | 86 | /* Set by module param to skip cd */ |
| 87 | static int idescsi_nocd; | ||
| 112 | 88 | ||
| 113 | #define ide_scsi_g(disk) \ | 89 | #define ide_scsi_g(disk) \ |
| 114 | container_of((disk)->private_data, struct ide_scsi_obj, driver) | 90 | container_of((disk)->private_data, struct ide_scsi_obj, driver) |
| @@ -152,22 +128,11 @@ static inline idescsi_scsi_t *drive_to_idescsi(ide_drive_t *ide_drive) | |||
| 152 | */ | 128 | */ |
| 153 | #define IDESCSI_PC_RQ 90 | 129 | #define IDESCSI_PC_RQ 90 |
| 154 | 130 | ||
| 155 | static void idescsi_discard_data (ide_drive_t *drive, unsigned int bcount) | ||
| 156 | { | ||
| 157 | while (bcount--) | ||
| 158 | (void) HWIF(drive)->INB(IDE_DATA_REG); | ||
| 159 | } | ||
| 160 | |||
| 161 | static void idescsi_output_zeros (ide_drive_t *drive, unsigned int bcount) | ||
| 162 | { | ||
| 163 | while (bcount--) | ||
| 164 | HWIF(drive)->OUTB(0, IDE_DATA_REG); | ||
| 165 | } | ||
| 166 | |||
| 167 | /* | 131 | /* |
| 168 | * PIO data transfer routines using the scatter gather table. | 132 | * PIO data transfer routines using the scatter gather table. |
| 169 | */ | 133 | */ |
| 170 | static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigned int bcount) | 134 | static void idescsi_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, |
| 135 | unsigned int bcount) | ||
| 171 | { | 136 | { |
| 172 | int count; | 137 | int count; |
| 173 | char *buf; | 138 | char *buf; |
| @@ -200,11 +165,12 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne | |||
| 200 | 165 | ||
| 201 | if (bcount) { | 166 | if (bcount) { |
| 202 | printk (KERN_ERR "ide-scsi: scatter gather table too small, discarding data\n"); | 167 | printk (KERN_ERR "ide-scsi: scatter gather table too small, discarding data\n"); |
| 203 | idescsi_discard_data (drive, bcount); | 168 | ide_atapi_discard_data(drive, bcount); |
| 204 | } | 169 | } |
| 205 | } | 170 | } |
| 206 | 171 | ||
| 207 | static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigned int bcount) | 172 | static void idescsi_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, |
| 173 | unsigned int bcount) | ||
| 208 | { | 174 | { |
| 209 | int count; | 175 | int count; |
| 210 | char *buf; | 176 | char *buf; |
| @@ -237,7 +203,7 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign | |||
| 237 | 203 | ||
| 238 | if (bcount) { | 204 | if (bcount) { |
| 239 | printk (KERN_ERR "ide-scsi: scatter gather table too small, padding with zeros\n"); | 205 | printk (KERN_ERR "ide-scsi: scatter gather table too small, padding with zeros\n"); |
| 240 | idescsi_output_zeros (drive, bcount); | 206 | ide_atapi_write_zeros(drive, bcount); |
| 241 | } | 207 | } |
| 242 | } | 208 | } |
| 243 | 209 | ||
| @@ -246,15 +212,16 @@ static void ide_scsi_hex_dump(u8 *data, int len) | |||
| 246 | print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1, data, len, 0); | 212 | print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1, data, len, 0); |
| 247 | } | 213 | } |
| 248 | 214 | ||
| 249 | static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_command) | 215 | static int idescsi_check_condition(ide_drive_t *drive, |
| 216 | struct request *failed_cmd) | ||
| 250 | { | 217 | { |
| 251 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); | 218 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); |
| 252 | idescsi_pc_t *pc; | 219 | struct ide_atapi_pc *pc; |
| 253 | struct request *rq; | 220 | struct request *rq; |
| 254 | u8 *buf; | 221 | u8 *buf; |
| 255 | 222 | ||
| 256 | /* stuff a sense request in front of our current request */ | 223 | /* stuff a sense request in front of our current request */ |
| 257 | pc = kzalloc(sizeof(idescsi_pc_t), GFP_ATOMIC); | 224 | pc = kzalloc(sizeof(struct ide_atapi_pc), GFP_ATOMIC); |
| 258 | rq = kmalloc(sizeof(struct request), GFP_ATOMIC); | 225 | rq = kmalloc(sizeof(struct request), GFP_ATOMIC); |
| 259 | buf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_ATOMIC); | 226 | buf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_ATOMIC); |
| 260 | if (!pc || !rq || !buf) { | 227 | if (!pc || !rq || !buf) { |
| @@ -266,14 +233,14 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co | |||
| 266 | ide_init_drive_cmd(rq); | 233 | ide_init_drive_cmd(rq); |
| 267 | rq->special = (char *) pc; | 234 | rq->special = (char *) pc; |
| 268 | pc->rq = rq; | 235 | pc->rq = rq; |
| 269 | pc->buffer = buf; | 236 | pc->buf = buf; |
| 270 | pc->c[0] = REQUEST_SENSE; | 237 | pc->c[0] = REQUEST_SENSE; |
| 271 | pc->c[4] = pc->request_transfer = pc->buffer_size = SCSI_SENSE_BUFFERSIZE; | 238 | pc->c[4] = pc->req_xfer = pc->buf_size = SCSI_SENSE_BUFFERSIZE; |
| 272 | rq->cmd_type = REQ_TYPE_SENSE; | 239 | rq->cmd_type = REQ_TYPE_SENSE; |
| 273 | pc->timeout = jiffies + WAIT_READY; | 240 | pc->timeout = jiffies + WAIT_READY; |
| 274 | /* NOTE! Save the failed packet command in "rq->buffer" */ | 241 | /* NOTE! Save the failed packet command in "rq->buffer" */ |
| 275 | rq->buffer = (void *) failed_command->special; | 242 | rq->buffer = (void *) failed_cmd->special; |
| 276 | pc->scsi_cmd = ((idescsi_pc_t *) failed_command->special)->scsi_cmd; | 243 | pc->scsi_cmd = ((struct ide_atapi_pc *) failed_cmd->special)->scsi_cmd; |
| 277 | if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) { | 244 | if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) { |
| 278 | printk ("ide-scsi: %s: queue cmd = ", drive->name); | 245 | printk ("ide-scsi: %s: queue cmd = ", drive->name); |
| 279 | ide_scsi_hex_dump(pc->c, 6); | 246 | ide_scsi_hex_dump(pc->c, 6); |
| @@ -287,9 +254,12 @@ static int idescsi_end_request(ide_drive_t *, int, int); | |||
| 287 | static ide_startstop_t | 254 | static ide_startstop_t |
| 288 | idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err) | 255 | idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err) |
| 289 | { | 256 | { |
| 257 | ide_hwif_t *hwif = drive->hwif; | ||
| 258 | |||
| 290 | if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) | 259 | if (ide_read_status(drive) & (BUSY_STAT | DRQ_STAT)) |
| 291 | /* force an abort */ | 260 | /* force an abort */ |
| 292 | HWIF(drive)->OUTB(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG); | 261 | hwif->OUTB(WIN_IDLEIMMEDIATE, |
| 262 | hwif->io_ports[IDE_COMMAND_OFFSET]); | ||
| 293 | 263 | ||
| 294 | rq->errors++; | 264 | rq->errors++; |
| 295 | 265 | ||
| @@ -303,7 +273,7 @@ idescsi_atapi_abort(ide_drive_t *drive, struct request *rq) | |||
| 303 | { | 273 | { |
| 304 | #if IDESCSI_DEBUG_LOG | 274 | #if IDESCSI_DEBUG_LOG |
| 305 | printk(KERN_WARNING "idescsi_atapi_abort called for %lu\n", | 275 | printk(KERN_WARNING "idescsi_atapi_abort called for %lu\n", |
| 306 | ((idescsi_pc_t *) rq->special)->scsi_cmd->serial_number); | 276 | ((struct ide_atapi_pc *) rq->special)->scsi_cmd->serial_number); |
| 307 | #endif | 277 | #endif |
| 308 | rq->errors |= ERROR_MAX; | 278 | rq->errors |= ERROR_MAX; |
| 309 | 279 | ||
| @@ -316,7 +286,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 316 | { | 286 | { |
| 317 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); | 287 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); |
| 318 | struct request *rq = HWGROUP(drive)->rq; | 288 | struct request *rq = HWGROUP(drive)->rq; |
| 319 | idescsi_pc_t *pc = (idescsi_pc_t *) rq->special; | 289 | struct ide_atapi_pc *pc = (struct ide_atapi_pc *) rq->special; |
| 320 | int log = test_bit(IDESCSI_LOG_CMD, &scsi->log); | 290 | int log = test_bit(IDESCSI_LOG_CMD, &scsi->log); |
| 321 | struct Scsi_Host *host; | 291 | struct Scsi_Host *host; |
| 322 | int errors = rq->errors; | 292 | int errors = rq->errors; |
| @@ -328,20 +298,23 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 328 | } | 298 | } |
| 329 | ide_end_drive_cmd (drive, 0, 0); | 299 | ide_end_drive_cmd (drive, 0, 0); |
| 330 | if (blk_sense_request(rq)) { | 300 | if (blk_sense_request(rq)) { |
| 331 | idescsi_pc_t *opc = (idescsi_pc_t *) rq->buffer; | 301 | struct ide_atapi_pc *opc = (struct ide_atapi_pc *) rq->buffer; |
| 332 | if (log) { | 302 | if (log) { |
| 333 | printk ("ide-scsi: %s: wrap up check %lu, rst = ", drive->name, opc->scsi_cmd->serial_number); | 303 | printk ("ide-scsi: %s: wrap up check %lu, rst = ", drive->name, opc->scsi_cmd->serial_number); |
| 334 | ide_scsi_hex_dump(pc->buffer, 16); | 304 | ide_scsi_hex_dump(pc->buf, 16); |
| 335 | } | 305 | } |
| 336 | memcpy((void *) opc->scsi_cmd->sense_buffer, pc->buffer, SCSI_SENSE_BUFFERSIZE); | 306 | memcpy((void *) opc->scsi_cmd->sense_buffer, pc->buf, |
| 337 | kfree(pc->buffer); | 307 | SCSI_SENSE_BUFFERSIZE); |
| 308 | kfree(pc->buf); | ||
| 338 | kfree(pc); | 309 | kfree(pc); |
| 339 | kfree(rq); | 310 | kfree(rq); |
| 340 | pc = opc; | 311 | pc = opc; |
| 341 | rq = pc->rq; | 312 | rq = pc->rq; |
| 342 | pc->scsi_cmd->result = (CHECK_CONDITION << 1) | | 313 | pc->scsi_cmd->result = (CHECK_CONDITION << 1) | |
| 343 | ((test_bit(PC_TIMEDOUT, &pc->flags)?DID_TIME_OUT:DID_OK) << 16); | 314 | (((pc->flags & PC_FLAG_TIMEDOUT) ? |
| 344 | } else if (test_bit(PC_TIMEDOUT, &pc->flags)) { | 315 | DID_TIME_OUT : |
| 316 | DID_OK) << 16); | ||
| 317 | } else if (pc->flags & PC_FLAG_TIMEDOUT) { | ||
| 345 | if (log) | 318 | if (log) |
| 346 | printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n", | 319 | printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n", |
| 347 | drive->name, pc->scsi_cmd->serial_number); | 320 | drive->name, pc->scsi_cmd->serial_number); |
| @@ -370,7 +343,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 370 | return 0; | 343 | return 0; |
| 371 | } | 344 | } |
| 372 | 345 | ||
| 373 | static inline unsigned long get_timeout(idescsi_pc_t *pc) | 346 | static inline unsigned long get_timeout(struct ide_atapi_pc *pc) |
| 374 | { | 347 | { |
| 375 | return max_t(unsigned long, WAIT_CMD, pc->timeout - jiffies); | 348 | return max_t(unsigned long, WAIT_CMD, pc->timeout - jiffies); |
| 376 | } | 349 | } |
| @@ -378,12 +351,12 @@ static inline unsigned long get_timeout(idescsi_pc_t *pc) | |||
| 378 | static int idescsi_expiry(ide_drive_t *drive) | 351 | static int idescsi_expiry(ide_drive_t *drive) |
| 379 | { | 352 | { |
| 380 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); | 353 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); |
| 381 | idescsi_pc_t *pc = scsi->pc; | 354 | struct ide_atapi_pc *pc = scsi->pc; |
| 382 | 355 | ||
| 383 | #if IDESCSI_DEBUG_LOG | 356 | #if IDESCSI_DEBUG_LOG |
| 384 | printk(KERN_WARNING "idescsi_expiry called for %lu at %lu\n", pc->scsi_cmd->serial_number, jiffies); | 357 | printk(KERN_WARNING "idescsi_expiry called for %lu at %lu\n", pc->scsi_cmd->serial_number, jiffies); |
| 385 | #endif | 358 | #endif |
| 386 | set_bit(PC_TIMEDOUT, &pc->flags); | 359 | pc->flags |= PC_FLAG_TIMEDOUT; |
| 387 | 360 | ||
| 388 | return 0; /* we do not want the ide subsystem to retry */ | 361 | return 0; /* we do not want the ide subsystem to retry */ |
| 389 | } | 362 | } |
| @@ -395,7 +368,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
| 395 | { | 368 | { |
| 396 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); | 369 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); |
| 397 | ide_hwif_t *hwif = drive->hwif; | 370 | ide_hwif_t *hwif = drive->hwif; |
| 398 | idescsi_pc_t *pc = scsi->pc; | 371 | struct ide_atapi_pc *pc = scsi->pc; |
| 399 | struct request *rq = pc->rq; | 372 | struct request *rq = pc->rq; |
| 400 | unsigned int temp; | 373 | unsigned int temp; |
| 401 | u16 bcount; | 374 | u16 bcount; |
| @@ -405,7 +378,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
| 405 | printk (KERN_INFO "ide-scsi: Reached idescsi_pc_intr interrupt handler\n"); | 378 | printk (KERN_INFO "ide-scsi: Reached idescsi_pc_intr interrupt handler\n"); |
| 406 | #endif /* IDESCSI_DEBUG_LOG */ | 379 | #endif /* IDESCSI_DEBUG_LOG */ |
| 407 | 380 | ||
| 408 | if (test_bit(PC_TIMEDOUT, &pc->flags)){ | 381 | if (pc->flags & PC_FLAG_TIMEDOUT) { |
| 409 | #if IDESCSI_DEBUG_LOG | 382 | #if IDESCSI_DEBUG_LOG |
| 410 | printk(KERN_WARNING "idescsi_pc_intr: got timed out packet %lu at %lu\n", | 383 | printk(KERN_WARNING "idescsi_pc_intr: got timed out packet %lu at %lu\n", |
| 411 | pc->scsi_cmd->serial_number, jiffies); | 384 | pc->scsi_cmd->serial_number, jiffies); |
| @@ -414,11 +387,12 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
| 414 | idescsi_end_request (drive, 1, 0); | 387 | idescsi_end_request (drive, 1, 0); |
| 415 | return ide_stopped; | 388 | return ide_stopped; |
| 416 | } | 389 | } |
| 417 | if (test_and_clear_bit (PC_DMA_IN_PROGRESS, &pc->flags)) { | 390 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { |
| 391 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; | ||
| 418 | #if IDESCSI_DEBUG_LOG | 392 | #if IDESCSI_DEBUG_LOG |
| 419 | printk ("ide-scsi: %s: DMA complete\n", drive->name); | 393 | printk ("ide-scsi: %s: DMA complete\n", drive->name); |
| 420 | #endif /* IDESCSI_DEBUG_LOG */ | 394 | #endif /* IDESCSI_DEBUG_LOG */ |
| 421 | pc->actually_transferred=pc->request_transfer; | 395 | pc->xferred = pc->req_xfer; |
| 422 | (void) HWIF(drive)->ide_dma_end(drive); | 396 | (void) HWIF(drive)->ide_dma_end(drive); |
| 423 | } | 397 | } |
| 424 | 398 | ||
| @@ -428,42 +402,44 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
| 428 | if ((stat & DRQ_STAT) == 0) { | 402 | if ((stat & DRQ_STAT) == 0) { |
| 429 | /* No more interrupts */ | 403 | /* No more interrupts */ |
| 430 | if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) | 404 | if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) |
| 431 | printk (KERN_INFO "Packet command completed, %d bytes transferred\n", pc->actually_transferred); | 405 | printk(KERN_INFO "Packet command completed, %d bytes" |
| 406 | " transferred\n", pc->xferred); | ||
| 432 | local_irq_enable_in_hardirq(); | 407 | local_irq_enable_in_hardirq(); |
| 433 | if (stat & ERR_STAT) | 408 | if (stat & ERR_STAT) |
| 434 | rq->errors++; | 409 | rq->errors++; |
| 435 | idescsi_end_request (drive, 1, 0); | 410 | idescsi_end_request (drive, 1, 0); |
| 436 | return ide_stopped; | 411 | return ide_stopped; |
| 437 | } | 412 | } |
| 438 | bcount = (hwif->INB(IDE_BCOUNTH_REG) << 8) | | 413 | bcount = (hwif->INB(hwif->io_ports[IDE_BCOUNTH_OFFSET]) << 8) | |
| 439 | hwif->INB(IDE_BCOUNTL_REG); | 414 | hwif->INB(hwif->io_ports[IDE_BCOUNTL_OFFSET]); |
| 440 | ireason = hwif->INB(IDE_IREASON_REG); | 415 | ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]); |
| 441 | 416 | ||
| 442 | if (ireason & CD) { | 417 | if (ireason & CD) { |
| 443 | printk(KERN_ERR "ide-scsi: CoD != 0 in idescsi_pc_intr\n"); | 418 | printk(KERN_ERR "ide-scsi: CoD != 0 in idescsi_pc_intr\n"); |
| 444 | return ide_do_reset (drive); | 419 | return ide_do_reset (drive); |
| 445 | } | 420 | } |
| 446 | if (ireason & IO) { | 421 | if (ireason & IO) { |
| 447 | temp = pc->actually_transferred + bcount; | 422 | temp = pc->xferred + bcount; |
| 448 | if (temp > pc->request_transfer) { | 423 | if (temp > pc->req_xfer) { |
| 449 | if (temp > pc->buffer_size) { | 424 | if (temp > pc->buf_size) { |
| 450 | printk(KERN_ERR "ide-scsi: The scsi wants to " | 425 | printk(KERN_ERR "ide-scsi: The scsi wants to " |
| 451 | "send us more data than expected " | 426 | "send us more data than expected " |
| 452 | "- discarding data\n"); | 427 | "- discarding data\n"); |
| 453 | temp = pc->buffer_size - pc->actually_transferred; | 428 | temp = pc->buf_size - pc->xferred; |
| 454 | if (temp) { | 429 | if (temp) { |
| 455 | clear_bit(PC_WRITING, &pc->flags); | 430 | pc->flags &= ~PC_FLAG_WRITING; |
| 456 | if (pc->sg) | 431 | if (pc->sg) |
| 457 | idescsi_input_buffers(drive, pc, temp); | 432 | idescsi_input_buffers(drive, pc, |
| 433 | temp); | ||
| 458 | else | 434 | else |
| 459 | drive->hwif->atapi_input_bytes(drive, pc->current_position, temp); | 435 | drive->hwif->atapi_input_bytes(drive, pc->cur_pos, temp); |
| 460 | printk(KERN_ERR "ide-scsi: transferred" | 436 | printk(KERN_ERR "ide-scsi: transferred" |
| 461 | " %d of %d bytes\n", | 437 | " %d of %d bytes\n", |
| 462 | temp, bcount); | 438 | temp, bcount); |
| 463 | } | 439 | } |
| 464 | pc->actually_transferred += temp; | 440 | pc->xferred += temp; |
| 465 | pc->current_position += temp; | 441 | pc->cur_pos += temp; |
| 466 | idescsi_discard_data(drive, bcount - temp); | 442 | ide_atapi_discard_data(drive, bcount - temp); |
| 467 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); | 443 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); |
| 468 | return ide_started; | 444 | return ide_started; |
| 469 | } | 445 | } |
| @@ -473,23 +449,23 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
| 473 | } | 449 | } |
| 474 | } | 450 | } |
| 475 | if (ireason & IO) { | 451 | if (ireason & IO) { |
| 476 | clear_bit(PC_WRITING, &pc->flags); | 452 | pc->flags &= ~PC_FLAG_WRITING; |
| 477 | if (pc->sg) | 453 | if (pc->sg) |
| 478 | idescsi_input_buffers(drive, pc, bcount); | 454 | idescsi_input_buffers(drive, pc, bcount); |
| 479 | else | 455 | else |
| 480 | hwif->atapi_input_bytes(drive, pc->current_position, | 456 | hwif->atapi_input_bytes(drive, pc->cur_pos, |
| 481 | bcount); | 457 | bcount); |
| 482 | } else { | 458 | } else { |
| 483 | set_bit(PC_WRITING, &pc->flags); | 459 | pc->flags |= PC_FLAG_WRITING; |
| 484 | if (pc->sg) | 460 | if (pc->sg) |
| 485 | idescsi_output_buffers(drive, pc, bcount); | 461 | idescsi_output_buffers(drive, pc, bcount); |
| 486 | else | 462 | else |
| 487 | hwif->atapi_output_bytes(drive, pc->current_position, | 463 | hwif->atapi_output_bytes(drive, pc->cur_pos, |
| 488 | bcount); | 464 | bcount); |
| 489 | } | 465 | } |
| 490 | /* Update the current position */ | 466 | /* Update the current position */ |
| 491 | pc->actually_transferred += bcount; | 467 | pc->xferred += bcount; |
| 492 | pc->current_position += bcount; | 468 | pc->cur_pos += bcount; |
| 493 | 469 | ||
| 494 | /* And set the interrupt handler again */ | 470 | /* And set the interrupt handler again */ |
| 495 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); | 471 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); |
| @@ -500,7 +476,7 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) | |||
| 500 | { | 476 | { |
| 501 | ide_hwif_t *hwif = drive->hwif; | 477 | ide_hwif_t *hwif = drive->hwif; |
| 502 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); | 478 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); |
| 503 | idescsi_pc_t *pc = scsi->pc; | 479 | struct ide_atapi_pc *pc = scsi->pc; |
| 504 | ide_startstop_t startstop; | 480 | ide_startstop_t startstop; |
| 505 | u8 ireason; | 481 | u8 ireason; |
| 506 | 482 | ||
| @@ -509,7 +485,7 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) | |||
| 509 | "initiated yet DRQ isn't asserted\n"); | 485 | "initiated yet DRQ isn't asserted\n"); |
| 510 | return startstop; | 486 | return startstop; |
| 511 | } | 487 | } |
| 512 | ireason = hwif->INB(IDE_IREASON_REG); | 488 | ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]); |
| 513 | if ((ireason & CD) == 0 || (ireason & IO)) { | 489 | if ((ireason & CD) == 0 || (ireason & IO)) { |
| 514 | printk(KERN_ERR "ide-scsi: (IO,CoD) != (0,1) while " | 490 | printk(KERN_ERR "ide-scsi: (IO,CoD) != (0,1) while " |
| 515 | "issuing a packet command\n"); | 491 | "issuing a packet command\n"); |
| @@ -520,34 +496,34 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) | |||
| 520 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); | 496 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); |
| 521 | /* Send the actual packet */ | 497 | /* Send the actual packet */ |
| 522 | drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12); | 498 | drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12); |
| 523 | if (test_bit (PC_DMA_OK, &pc->flags)) { | 499 | if (pc->flags & PC_FLAG_DMA_OK) { |
| 524 | set_bit (PC_DMA_IN_PROGRESS, &pc->flags); | 500 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; |
| 525 | hwif->dma_start(drive); | 501 | hwif->dma_start(drive); |
| 526 | } | 502 | } |
| 527 | return ide_started; | 503 | return ide_started; |
| 528 | } | 504 | } |
| 529 | 505 | ||
| 530 | static inline int idescsi_set_direction(idescsi_pc_t *pc) | 506 | static inline int idescsi_set_direction(struct ide_atapi_pc *pc) |
| 531 | { | 507 | { |
| 532 | switch (pc->c[0]) { | 508 | switch (pc->c[0]) { |
| 533 | case READ_6: case READ_10: case READ_12: | 509 | case READ_6: case READ_10: case READ_12: |
| 534 | clear_bit(PC_WRITING, &pc->flags); | 510 | pc->flags &= ~PC_FLAG_WRITING; |
| 535 | return 0; | 511 | return 0; |
| 536 | case WRITE_6: case WRITE_10: case WRITE_12: | 512 | case WRITE_6: case WRITE_10: case WRITE_12: |
| 537 | set_bit(PC_WRITING, &pc->flags); | 513 | pc->flags |= PC_FLAG_WRITING; |
| 538 | return 0; | 514 | return 0; |
| 539 | default: | 515 | default: |
| 540 | return 1; | 516 | return 1; |
| 541 | } | 517 | } |
| 542 | } | 518 | } |
| 543 | 519 | ||
| 544 | static int idescsi_map_sg(ide_drive_t *drive, idescsi_pc_t *pc) | 520 | static int idescsi_map_sg(ide_drive_t *drive, struct ide_atapi_pc *pc) |
| 545 | { | 521 | { |
| 546 | ide_hwif_t *hwif = drive->hwif; | 522 | ide_hwif_t *hwif = drive->hwif; |
| 547 | struct scatterlist *sg, *scsi_sg; | 523 | struct scatterlist *sg, *scsi_sg; |
| 548 | int segments; | 524 | int segments; |
| 549 | 525 | ||
| 550 | if (!pc->request_transfer || pc->request_transfer % 1024) | 526 | if (!pc->req_xfer || pc->req_xfer % 1024) |
| 551 | return 1; | 527 | return 1; |
| 552 | 528 | ||
| 553 | if (idescsi_set_direction(pc)) | 529 | if (idescsi_set_direction(pc)) |
| @@ -566,21 +542,21 @@ static int idescsi_map_sg(ide_drive_t *drive, idescsi_pc_t *pc) | |||
| 566 | return 0; | 542 | return 0; |
| 567 | } | 543 | } |
| 568 | 544 | ||
| 569 | /* | 545 | static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive, |
| 570 | * Issue a packet command | 546 | struct ide_atapi_pc *pc) |
| 571 | */ | ||
| 572 | static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc) | ||
| 573 | { | 547 | { |
| 574 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); | 548 | idescsi_scsi_t *scsi = drive_to_idescsi(drive); |
| 575 | ide_hwif_t *hwif = drive->hwif; | 549 | ide_hwif_t *hwif = drive->hwif; |
| 576 | u16 bcount; | 550 | u16 bcount; |
| 577 | u8 dma = 0; | 551 | u8 dma = 0; |
| 578 | 552 | ||
| 579 | scsi->pc=pc; /* Set the current packet command */ | 553 | /* Set the current packet command */ |
| 580 | pc->actually_transferred=0; /* We haven't transferred any data yet */ | 554 | scsi->pc = pc; |
| 581 | pc->current_position=pc->buffer; | 555 | /* We haven't transferred any data yet */ |
| 556 | pc->xferred = 0; | ||
| 557 | pc->cur_pos = pc->buf; | ||
| 582 | /* Request to transfer the entire buffer at once */ | 558 | /* Request to transfer the entire buffer at once */ |
| 583 | bcount = min(pc->request_transfer, 63 * 1024); | 559 | bcount = min(pc->req_xfer, 63 * 1024); |
| 584 | 560 | ||
| 585 | if (drive->using_dma && !idescsi_map_sg(drive, pc)) { | 561 | if (drive->using_dma && !idescsi_map_sg(drive, pc)) { |
| 586 | hwif->sg_mapped = 1; | 562 | hwif->sg_mapped = 1; |
| @@ -591,7 +567,7 @@ static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc) | |||
| 591 | ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK, bcount, dma); | 567 | ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK, bcount, dma); |
| 592 | 568 | ||
| 593 | if (dma) | 569 | if (dma) |
| 594 | set_bit(PC_DMA_OK, &pc->flags); | 570 | pc->flags |= PC_FLAG_DMA_OK; |
| 595 | 571 | ||
| 596 | if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) { | 572 | if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) { |
| 597 | ide_execute_command(drive, WIN_PACKETCMD, &idescsi_transfer_pc, | 573 | ide_execute_command(drive, WIN_PACKETCMD, &idescsi_transfer_pc, |
| @@ -599,7 +575,7 @@ static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc) | |||
| 599 | return ide_started; | 575 | return ide_started; |
| 600 | } else { | 576 | } else { |
| 601 | /* Issue the packet command */ | 577 | /* Issue the packet command */ |
| 602 | HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG); | 578 | hwif->OUTB(WIN_PACKETCMD, hwif->io_ports[IDE_COMMAND_OFFSET]); |
| 603 | return idescsi_transfer_pc(drive); | 579 | return idescsi_transfer_pc(drive); |
| 604 | } | 580 | } |
| 605 | } | 581 | } |
| @@ -615,7 +591,8 @@ static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *r | |||
| 615 | #endif /* IDESCSI_DEBUG_LOG */ | 591 | #endif /* IDESCSI_DEBUG_LOG */ |
| 616 | 592 | ||
| 617 | if (blk_sense_request(rq) || blk_special_request(rq)) { | 593 | if (blk_sense_request(rq) || blk_special_request(rq)) { |
| 618 | return idescsi_issue_pc (drive, (idescsi_pc_t *) rq->special); | 594 | return idescsi_issue_pc(drive, |
| 595 | (struct ide_atapi_pc *) rq->special); | ||
| 619 | } | 596 | } |
| 620 | blk_dump_rq_flags(rq, "ide-scsi: unsup command"); | 597 | blk_dump_rq_flags(rq, "ide-scsi: unsup command"); |
| 621 | idescsi_end_request (drive, 0, 0); | 598 | idescsi_end_request (drive, 0, 0); |
| @@ -773,15 +750,15 @@ static int idescsi_queue (struct scsi_cmnd *cmd, | |||
| 773 | idescsi_scsi_t *scsi = scsihost_to_idescsi(host); | 750 | idescsi_scsi_t *scsi = scsihost_to_idescsi(host); |
| 774 | ide_drive_t *drive = scsi->drive; | 751 | ide_drive_t *drive = scsi->drive; |
| 775 | struct request *rq = NULL; | 752 | struct request *rq = NULL; |
| 776 | idescsi_pc_t *pc = NULL; | 753 | struct ide_atapi_pc *pc = NULL; |
| 777 | 754 | ||
| 778 | if (!drive) { | 755 | if (!drive) { |
| 779 | scmd_printk (KERN_ERR, cmd, "drive not present\n"); | 756 | scmd_printk (KERN_ERR, cmd, "drive not present\n"); |
| 780 | goto abort; | 757 | goto abort; |
| 781 | } | 758 | } |
| 782 | scsi = drive_to_idescsi(drive); | 759 | scsi = drive_to_idescsi(drive); |
| 783 | pc = kmalloc (sizeof (idescsi_pc_t), GFP_ATOMIC); | 760 | pc = kmalloc(sizeof(struct ide_atapi_pc), GFP_ATOMIC); |
| 784 | rq = kmalloc (sizeof (struct request), GFP_ATOMIC); | 761 | rq = kmalloc(sizeof(struct request), GFP_ATOMIC); |
| 785 | if (rq == NULL || pc == NULL) { | 762 | if (rq == NULL || pc == NULL) { |
| 786 | printk (KERN_ERR "ide-scsi: %s: out of memory\n", drive->name); | 763 | printk (KERN_ERR "ide-scsi: %s: out of memory\n", drive->name); |
| 787 | goto abort; | 764 | goto abort; |
| @@ -791,11 +768,11 @@ static int idescsi_queue (struct scsi_cmnd *cmd, | |||
| 791 | pc->flags = 0; | 768 | pc->flags = 0; |
| 792 | pc->rq = rq; | 769 | pc->rq = rq; |
| 793 | memcpy (pc->c, cmd->cmnd, cmd->cmd_len); | 770 | memcpy (pc->c, cmd->cmnd, cmd->cmd_len); |
| 794 | pc->buffer = NULL; | 771 | pc->buf = NULL; |
| 795 | pc->sg = scsi_sglist(cmd); | 772 | pc->sg = scsi_sglist(cmd); |
| 796 | pc->sg_cnt = scsi_sg_count(cmd); | 773 | pc->sg_cnt = scsi_sg_count(cmd); |
| 797 | pc->b_count = 0; | 774 | pc->b_count = 0; |
| 798 | pc->request_transfer = pc->buffer_size = scsi_bufflen(cmd); | 775 | pc->req_xfer = pc->buf_size = scsi_bufflen(cmd); |
| 799 | pc->scsi_cmd = cmd; | 776 | pc->scsi_cmd = cmd; |
| 800 | pc->done = done; | 777 | pc->done = done; |
| 801 | pc->timeout = jiffies + cmd->timeout_per_command; | 778 | pc->timeout = jiffies + cmd->timeout_per_command; |
| @@ -866,7 +843,7 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd) | |||
| 866 | printk (KERN_ERR "ide-scsi: cmd aborted!\n"); | 843 | printk (KERN_ERR "ide-scsi: cmd aborted!\n"); |
| 867 | 844 | ||
| 868 | if (blk_sense_request(scsi->pc->rq)) | 845 | if (blk_sense_request(scsi->pc->rq)) |
| 869 | kfree(scsi->pc->buffer); | 846 | kfree(scsi->pc->buf); |
| 870 | kfree(scsi->pc->rq); | 847 | kfree(scsi->pc->rq); |
| 871 | kfree(scsi->pc); | 848 | kfree(scsi->pc); |
| 872 | scsi->pc = NULL; | 849 | scsi->pc = NULL; |
| @@ -916,7 +893,7 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd) | |||
| 916 | if (__blk_end_request(req, -EIO, 0)) | 893 | if (__blk_end_request(req, -EIO, 0)) |
| 917 | BUG(); | 894 | BUG(); |
| 918 | if (blk_sense_request(req)) | 895 | if (blk_sense_request(req)) |
| 919 | kfree(scsi->pc->buffer); | 896 | kfree(scsi->pc->buf); |
| 920 | kfree(scsi->pc); | 897 | kfree(scsi->pc); |
| 921 | scsi->pc = NULL; | 898 | scsi->pc = NULL; |
| 922 | kfree(req); | 899 | kfree(req); |
