root/drivers/ide/ide-atapi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. dev_is_idecd
  2. ide_check_atapi_device
  3. ide_init_pc
  4. ide_queue_pc_tail
  5. ide_do_test_unit_ready
  6. ide_do_start_stop
  7. ide_set_media_lock
  8. ide_create_request_sense_cmd
  9. ide_prep_sense
  10. ide_queue_sense_rq
  11. ide_retry_pc
  12. ide_cd_expiry
  13. ide_cd_get_xferlen
  14. ide_read_bcount_and_ireason
  15. ide_check_ireason
  16. ide_pc_intr
  17. ide_init_packet_cmd
  18. ide_read_ireason
  19. ide_wait_ireason
  20. ide_delayed_transfer_pc
  21. ide_transfer_pc
  22. ide_issue_pc

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * ATAPI support.
   4  */
   5 
   6 #include <linux/kernel.h>
   7 #include <linux/cdrom.h>
   8 #include <linux/delay.h>
   9 #include <linux/export.h>
  10 #include <linux/ide.h>
  11 #include <linux/scatterlist.h>
  12 #include <linux/gfp.h>
  13 
  14 #include <scsi/scsi.h>
  15 
  16 #define DRV_NAME "ide-atapi"
  17 #define PFX DRV_NAME ": "
  18 
  19 #ifdef DEBUG
  20 #define debug_log(fmt, args...) \
  21         printk(KERN_INFO "ide: " fmt, ## args)
  22 #else
  23 #define debug_log(fmt, args...) do {} while (0)
  24 #endif
  25 
  26 #define ATAPI_MIN_CDB_BYTES     12
  27 
  28 static inline int dev_is_idecd(ide_drive_t *drive)
  29 {
  30         return drive->media == ide_cdrom || drive->media == ide_optical;
  31 }
  32 
  33 /*
  34  * Check whether we can support a device,
  35  * based on the ATAPI IDENTIFY command results.
  36  */
  37 int ide_check_atapi_device(ide_drive_t *drive, const char *s)
  38 {
  39         u16 *id = drive->id;
  40         u8 gcw[2], protocol, device_type, removable, drq_type, packet_size;
  41 
  42         *((u16 *)&gcw) = id[ATA_ID_CONFIG];
  43 
  44         protocol    = (gcw[1] & 0xC0) >> 6;
  45         device_type =  gcw[1] & 0x1F;
  46         removable   = (gcw[0] & 0x80) >> 7;
  47         drq_type    = (gcw[0] & 0x60) >> 5;
  48         packet_size =  gcw[0] & 0x03;
  49 
  50 #ifdef CONFIG_PPC
  51         /* kludge for Apple PowerBook internal zip */
  52         if (drive->media == ide_floppy && device_type == 5 &&
  53             !strstr((char *)&id[ATA_ID_PROD], "CD-ROM") &&
  54             strstr((char *)&id[ATA_ID_PROD], "ZIP"))
  55                 device_type = 0;
  56 #endif
  57 
  58         if (protocol != 2)
  59                 printk(KERN_ERR "%s: %s: protocol (0x%02x) is not ATAPI\n",
  60                         s, drive->name, protocol);
  61         else if ((drive->media == ide_floppy && device_type != 0) ||
  62                  (drive->media == ide_tape && device_type != 1))
  63                 printk(KERN_ERR "%s: %s: invalid device type (0x%02x)\n",
  64                         s, drive->name, device_type);
  65         else if (removable == 0)
  66                 printk(KERN_ERR "%s: %s: the removable flag is not set\n",
  67                         s, drive->name);
  68         else if (drive->media == ide_floppy && drq_type == 3)
  69                 printk(KERN_ERR "%s: %s: sorry, DRQ type (0x%02x) not "
  70                         "supported\n", s, drive->name, drq_type);
  71         else if (packet_size != 0)
  72                 printk(KERN_ERR "%s: %s: packet size (0x%02x) is not 12 "
  73                         "bytes\n", s, drive->name, packet_size);
  74         else
  75                 return 1;
  76         return 0;
  77 }
  78 EXPORT_SYMBOL_GPL(ide_check_atapi_device);
  79 
  80 void ide_init_pc(struct ide_atapi_pc *pc)
  81 {
  82         memset(pc, 0, sizeof(*pc));
  83 }
  84 EXPORT_SYMBOL_GPL(ide_init_pc);
  85 
  86 /*
  87  * Add a special packet command request to the tail of the request queue,
  88  * and wait for it to be serviced.
  89  */
  90 int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk,
  91                       struct ide_atapi_pc *pc, void *buf, unsigned int bufflen)
  92 {
  93         struct request *rq;
  94         int error;
  95 
  96         rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0);
  97         ide_req(rq)->type = ATA_PRIV_MISC;
  98         ide_req(rq)->special = pc;
  99 
 100         if (buf && bufflen) {
 101                 error = blk_rq_map_kern(drive->queue, rq, buf, bufflen,
 102                                         GFP_NOIO);
 103                 if (error)
 104                         goto put_req;
 105         }
 106 
 107         memcpy(scsi_req(rq)->cmd, pc->c, 12);
 108         if (drive->media == ide_tape)
 109                 scsi_req(rq)->cmd[13] = REQ_IDETAPE_PC1;
 110         blk_execute_rq(drive->queue, disk, rq, 0);
 111         error = scsi_req(rq)->result ? -EIO : 0;
 112 put_req:
 113         blk_put_request(rq);
 114         return error;
 115 }
 116 EXPORT_SYMBOL_GPL(ide_queue_pc_tail);
 117 
 118 int ide_do_test_unit_ready(ide_drive_t *drive, struct gendisk *disk)
 119 {
 120         struct ide_atapi_pc pc;
 121 
 122         ide_init_pc(&pc);
 123         pc.c[0] = TEST_UNIT_READY;
 124 
 125         return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
 126 }
 127 EXPORT_SYMBOL_GPL(ide_do_test_unit_ready);
 128 
 129 int ide_do_start_stop(ide_drive_t *drive, struct gendisk *disk, int start)
 130 {
 131         struct ide_atapi_pc pc;
 132 
 133         ide_init_pc(&pc);
 134         pc.c[0] = START_STOP;
 135         pc.c[4] = start;
 136 
 137         if (drive->media == ide_tape)
 138                 pc.flags |= PC_FLAG_WAIT_FOR_DSC;
 139 
 140         return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
 141 }
 142 EXPORT_SYMBOL_GPL(ide_do_start_stop);
 143 
 144 int ide_set_media_lock(ide_drive_t *drive, struct gendisk *disk, int on)
 145 {
 146         struct ide_atapi_pc pc;
 147 
 148         if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0)
 149                 return 0;
 150 
 151         ide_init_pc(&pc);
 152         pc.c[0] = ALLOW_MEDIUM_REMOVAL;
 153         pc.c[4] = on;
 154 
 155         return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
 156 }
 157 EXPORT_SYMBOL_GPL(ide_set_media_lock);
 158 
 159 void ide_create_request_sense_cmd(ide_drive_t *drive, struct ide_atapi_pc *pc)
 160 {
 161         ide_init_pc(pc);
 162         pc->c[0] = REQUEST_SENSE;
 163         if (drive->media == ide_floppy) {
 164                 pc->c[4] = 255;
 165                 pc->req_xfer = 18;
 166         } else {
 167                 pc->c[4] = 20;
 168                 pc->req_xfer = 20;
 169         }
 170 }
 171 EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd);
 172 
 173 void ide_prep_sense(ide_drive_t *drive, struct request *rq)
 174 {
 175         struct request_sense *sense = &drive->sense_data;
 176         struct request *sense_rq;
 177         struct scsi_request *req;
 178         unsigned int cmd_len, sense_len;
 179         int err;
 180 
 181         switch (drive->media) {
 182         case ide_floppy:
 183                 cmd_len = 255;
 184                 sense_len = 18;
 185                 break;
 186         case ide_tape:
 187                 cmd_len = 20;
 188                 sense_len = 20;
 189                 break;
 190         default:
 191                 cmd_len = 18;
 192                 sense_len = 18;
 193         }
 194 
 195         BUG_ON(sense_len > sizeof(*sense));
 196 
 197         if (ata_sense_request(rq) || drive->sense_rq_armed)
 198                 return;
 199 
 200         sense_rq = drive->sense_rq;
 201         if (!sense_rq) {
 202                 sense_rq = blk_mq_alloc_request(drive->queue, REQ_OP_DRV_IN,
 203                                         BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT);
 204                 drive->sense_rq = sense_rq;
 205         }
 206         req = scsi_req(sense_rq);
 207 
 208         memset(sense, 0, sizeof(*sense));
 209 
 210         scsi_req_init(req);
 211 
 212         err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len,
 213                               GFP_NOIO);
 214         if (unlikely(err)) {
 215                 if (printk_ratelimit())
 216                         printk(KERN_WARNING PFX "%s: failed to map sense "
 217                                             "buffer\n", drive->name);
 218                 blk_mq_free_request(sense_rq);
 219                 drive->sense_rq = NULL;
 220                 return;
 221         }
 222 
 223         sense_rq->rq_disk = rq->rq_disk;
 224         sense_rq->cmd_flags = REQ_OP_DRV_IN;
 225         ide_req(sense_rq)->type = ATA_PRIV_SENSE;
 226         sense_rq->rq_flags |= RQF_PREEMPT;
 227 
 228         req->cmd[0] = GPCMD_REQUEST_SENSE;
 229         req->cmd[4] = cmd_len;
 230         if (drive->media == ide_tape)
 231                 req->cmd[13] = REQ_IDETAPE_PC1;
 232 
 233         drive->sense_rq_armed = true;
 234 }
 235 EXPORT_SYMBOL_GPL(ide_prep_sense);
 236 
 237 int ide_queue_sense_rq(ide_drive_t *drive, void *special)
 238 {
 239         ide_hwif_t *hwif = drive->hwif;
 240         struct request *sense_rq;
 241         unsigned long flags;
 242 
 243         spin_lock_irqsave(&hwif->lock, flags);
 244 
 245         /* deferred failure from ide_prep_sense() */
 246         if (!drive->sense_rq_armed) {
 247                 printk(KERN_WARNING PFX "%s: error queuing a sense request\n",
 248                        drive->name);
 249                 spin_unlock_irqrestore(&hwif->lock, flags);
 250                 return -ENOMEM;
 251         }
 252 
 253         sense_rq = drive->sense_rq;
 254         ide_req(sense_rq)->special = special;
 255         drive->sense_rq_armed = false;
 256 
 257         drive->hwif->rq = NULL;
 258 
 259         ide_insert_request_head(drive, sense_rq);
 260         spin_unlock_irqrestore(&hwif->lock, flags);
 261         return 0;
 262 }
 263 EXPORT_SYMBOL_GPL(ide_queue_sense_rq);
 264 
 265 /*
 266  * Called when an error was detected during the last packet command.
 267  * We queue a request sense packet command at the head of the request
 268  * queue.
 269  */
 270 void ide_retry_pc(ide_drive_t *drive)
 271 {
 272         struct request *failed_rq = drive->hwif->rq;
 273         struct request *sense_rq = drive->sense_rq;
 274         struct ide_atapi_pc *pc = &drive->request_sense_pc;
 275 
 276         (void)ide_read_error(drive);
 277 
 278         /* init pc from sense_rq */
 279         ide_init_pc(pc);
 280         memcpy(pc->c, scsi_req(sense_rq)->cmd, 12);
 281 
 282         if (drive->media == ide_tape)
 283                 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC;
 284 
 285         /*
 286          * Push back the failed request and put request sense on top
 287          * of it.  The failed command will be retried after sense data
 288          * is acquired.
 289          */
 290         drive->hwif->rq = NULL;
 291         ide_requeue_and_plug(drive, failed_rq);
 292         if (ide_queue_sense_rq(drive, pc))
 293                 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(failed_rq));
 294 }
 295 EXPORT_SYMBOL_GPL(ide_retry_pc);
 296 
 297 int ide_cd_expiry(ide_drive_t *drive)
 298 {
 299         struct request *rq = drive->hwif->rq;
 300         unsigned long wait = 0;
 301 
 302         debug_log("%s: scsi_req(rq)->cmd[0]: 0x%x\n", __func__, scsi_req(rq)->cmd[0]);
 303 
 304         /*
 305          * Some commands are *slow* and normally take a long time to complete.
 306          * Usually we can use the ATAPI "disconnect" to bypass this, but not all
 307          * commands/drives support that. Let ide_timer_expiry keep polling us
 308          * for these.
 309          */
 310         switch (scsi_req(rq)->cmd[0]) {
 311         case GPCMD_BLANK:
 312         case GPCMD_FORMAT_UNIT:
 313         case GPCMD_RESERVE_RZONE_TRACK:
 314         case GPCMD_CLOSE_TRACK:
 315         case GPCMD_FLUSH_CACHE:
 316                 wait = ATAPI_WAIT_PC;
 317                 break;
 318         default:
 319                 if (!(rq->rq_flags & RQF_QUIET))
 320                         printk(KERN_INFO PFX "cmd 0x%x timed out\n",
 321                                          scsi_req(rq)->cmd[0]);
 322                 wait = 0;
 323                 break;
 324         }
 325         return wait;
 326 }
 327 EXPORT_SYMBOL_GPL(ide_cd_expiry);
 328 
 329 int ide_cd_get_xferlen(struct request *rq)
 330 {
 331         switch (req_op(rq)) {
 332         default:
 333                 return 32768;
 334         case REQ_OP_SCSI_IN:
 335         case REQ_OP_SCSI_OUT:
 336                 return blk_rq_bytes(rq);
 337         case REQ_OP_DRV_IN:
 338         case REQ_OP_DRV_OUT:
 339                 switch (ide_req(rq)->type) {
 340                 case ATA_PRIV_PC:
 341                 case ATA_PRIV_SENSE:
 342                         return blk_rq_bytes(rq);
 343                 default:
 344                         return 0;
 345                 }
 346         }
 347 }
 348 EXPORT_SYMBOL_GPL(ide_cd_get_xferlen);
 349 
 350 void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason)
 351 {
 352         struct ide_taskfile tf;
 353 
 354         drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT |
 355                                      IDE_VALID_LBAM | IDE_VALID_LBAH);
 356 
 357         *bcount = (tf.lbah << 8) | tf.lbam;
 358         *ireason = tf.nsect & 3;
 359 }
 360 EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason);
 361 
 362 /*
 363  * Check the contents of the interrupt reason register and attempt to recover if
 364  * there are problems.
 365  *
 366  * Returns:
 367  * - 0 if everything's ok
 368  * - 1 if the request has to be terminated.
 369  */
 370 int ide_check_ireason(ide_drive_t *drive, struct request *rq, int len,
 371                       int ireason, int rw)
 372 {
 373         ide_hwif_t *hwif = drive->hwif;
 374 
 375         debug_log("ireason: 0x%x, rw: 0x%x\n", ireason, rw);
 376 
 377         if (ireason == (!rw << 1))
 378                 return 0;
 379         else if (ireason == (rw << 1)) {
 380                 printk(KERN_ERR PFX "%s: %s: wrong transfer direction!\n",
 381                                 drive->name, __func__);
 382 
 383                 if (dev_is_idecd(drive))
 384                         ide_pad_transfer(drive, rw, len);
 385         } else if (!rw && ireason == ATAPI_COD) {
 386                 if (dev_is_idecd(drive)) {
 387                         /*
 388                          * Some drives (ASUS) seem to tell us that status info
 389                          * is available.  Just get it and ignore.
 390                          */
 391                         (void)hwif->tp_ops->read_status(hwif);
 392                         return 0;
 393                 }
 394         } else {
 395                 if (ireason & ATAPI_COD)
 396                         printk(KERN_ERR PFX "%s: CoD != 0 in %s\n", drive->name,
 397                                         __func__);
 398 
 399                 /* drive wants a command packet, or invalid ireason... */
 400                 printk(KERN_ERR PFX "%s: %s: bad interrupt reason 0x%02x\n",
 401                                 drive->name, __func__, ireason);
 402         }
 403 
 404         if (dev_is_idecd(drive) && ata_pc_request(rq))
 405                 rq->rq_flags |= RQF_FAILED;
 406 
 407         return 1;
 408 }
 409 EXPORT_SYMBOL_GPL(ide_check_ireason);
 410 
 411 /*
 412  * This is the usual interrupt handler which will be called during a packet
 413  * command.  We will transfer some of the data (as requested by the drive)
 414  * and will re-point interrupt handler to us.
 415  */
 416 static ide_startstop_t ide_pc_intr(ide_drive_t *drive)
 417 {
 418         struct ide_atapi_pc *pc = drive->pc;
 419         ide_hwif_t *hwif = drive->hwif;
 420         struct ide_cmd *cmd = &hwif->cmd;
 421         struct request *rq = hwif->rq;
 422         const struct ide_tp_ops *tp_ops = hwif->tp_ops;
 423         unsigned int timeout, done;
 424         u16 bcount;
 425         u8 stat, ireason, dsc = 0;
 426         u8 write = !!(pc->flags & PC_FLAG_WRITING);
 427 
 428         debug_log("Enter %s - interrupt handler\n", __func__);
 429 
 430         timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
 431                                                : WAIT_TAPE_CMD;
 432 
 433         /* Clear the interrupt */
 434         stat = tp_ops->read_status(hwif);
 435 
 436         if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
 437                 int rc;
 438 
 439                 drive->waiting_for_dma = 0;
 440                 rc = hwif->dma_ops->dma_end(drive);
 441                 ide_dma_unmap_sg(drive, cmd);
 442 
 443                 if (rc || (drive->media == ide_tape && (stat & ATA_ERR))) {
 444                         if (drive->media == ide_floppy)
 445                                 printk(KERN_ERR PFX "%s: DMA %s error\n",
 446                                         drive->name, rq_data_dir(pc->rq)
 447                                                      ? "write" : "read");
 448                         pc->flags |= PC_FLAG_DMA_ERROR;
 449                 } else
 450                         scsi_req(rq)->resid_len = 0;
 451                 debug_log("%s: DMA finished\n", drive->name);
 452         }
 453 
 454         /* No more interrupts */
 455         if ((stat & ATA_DRQ) == 0) {
 456                 int uptodate;
 457                 blk_status_t error;
 458 
 459                 debug_log("Packet command completed, %d bytes transferred\n",
 460                           blk_rq_bytes(rq));
 461 
 462                 pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
 463 
 464                 local_irq_enable_in_hardirq();
 465 
 466                 if (drive->media == ide_tape &&
 467                     (stat & ATA_ERR) && scsi_req(rq)->cmd[0] == REQUEST_SENSE)
 468                         stat &= ~ATA_ERR;
 469 
 470                 if ((stat & ATA_ERR) || (pc->flags & PC_FLAG_DMA_ERROR)) {
 471                         /* Error detected */
 472                         debug_log("%s: I/O error\n", drive->name);
 473 
 474                         if (drive->media != ide_tape)
 475                                 scsi_req(pc->rq)->result++;
 476 
 477                         if (scsi_req(rq)->cmd[0] == REQUEST_SENSE) {
 478                                 printk(KERN_ERR PFX "%s: I/O error in request "
 479                                                 "sense command\n", drive->name);
 480                                 return ide_do_reset(drive);
 481                         }
 482 
 483                         debug_log("[cmd %x]: check condition\n", scsi_req(rq)->cmd[0]);
 484 
 485                         /* Retry operation */
 486                         ide_retry_pc(drive);
 487 
 488                         /* queued, but not started */
 489                         return ide_stopped;
 490                 }
 491                 pc->error = 0;
 492 
 493                 if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) && (stat & ATA_DSC) == 0)
 494                         dsc = 1;
 495 
 496                 /*
 497                  * ->pc_callback() might change rq->data_len for
 498                  * residual count, cache total length.
 499                  */
 500                 done = blk_rq_bytes(rq);
 501 
 502                 /* Command finished - Call the callback function */
 503                 uptodate = drive->pc_callback(drive, dsc);
 504 
 505                 if (uptodate == 0)
 506                         drive->failed_pc = NULL;
 507 
 508                 if (ata_misc_request(rq)) {
 509                         scsi_req(rq)->result = 0;
 510                         error = BLK_STS_OK;
 511                 } else {
 512 
 513                         if (blk_rq_is_passthrough(rq) && uptodate <= 0) {
 514                                 if (scsi_req(rq)->result == 0)
 515                                         scsi_req(rq)->result = -EIO;
 516                         }
 517 
 518                         error = uptodate ? BLK_STS_OK : BLK_STS_IOERR;
 519                 }
 520 
 521                 ide_complete_rq(drive, error, blk_rq_bytes(rq));
 522                 return ide_stopped;
 523         }
 524 
 525         if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
 526                 pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
 527                 printk(KERN_ERR PFX "%s: The device wants to issue more "
 528                                 "interrupts in DMA mode\n", drive->name);
 529                 ide_dma_off(drive);
 530                 return ide_do_reset(drive);
 531         }
 532 
 533         /* Get the number of bytes to transfer on this interrupt. */
 534         ide_read_bcount_and_ireason(drive, &bcount, &ireason);
 535 
 536         if (ide_check_ireason(drive, rq, bcount, ireason, write))
 537                 return ide_do_reset(drive);
 538 
 539         done = min_t(unsigned int, bcount, cmd->nleft);
 540         ide_pio_bytes(drive, cmd, write, done);
 541 
 542         /* Update transferred byte count */
 543         scsi_req(rq)->resid_len -= done;
 544 
 545         bcount -= done;
 546 
 547         if (bcount)
 548                 ide_pad_transfer(drive, write, bcount);
 549 
 550         debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n",
 551                   scsi_req(rq)->cmd[0], done, bcount, scsi_req(rq)->resid_len);
 552 
 553         /* And set the interrupt handler again */
 554         ide_set_handler(drive, ide_pc_intr, timeout);
 555         return ide_started;
 556 }
 557 
 558 static void ide_init_packet_cmd(struct ide_cmd *cmd, u8 valid_tf,
 559                                 u16 bcount, u8 dma)
 560 {
 561         cmd->protocol = dma ? ATAPI_PROT_DMA : ATAPI_PROT_PIO;
 562         cmd->valid.out.tf = IDE_VALID_LBAH | IDE_VALID_LBAM |
 563                             IDE_VALID_FEATURE | valid_tf;
 564         cmd->tf.command = ATA_CMD_PACKET;
 565         cmd->tf.feature = dma;          /* Use PIO/DMA */
 566         cmd->tf.lbam    = bcount & 0xff;
 567         cmd->tf.lbah    = (bcount >> 8) & 0xff;
 568 }
 569 
 570 static u8 ide_read_ireason(ide_drive_t *drive)
 571 {
 572         struct ide_taskfile tf;
 573 
 574         drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT);
 575 
 576         return tf.nsect & 3;
 577 }
 578 
 579 static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason)
 580 {
 581         int retries = 100;
 582 
 583         while (retries-- && ((ireason & ATAPI_COD) == 0 ||
 584                 (ireason & ATAPI_IO))) {
 585                 printk(KERN_ERR PFX "%s: (IO,CoD != (0,1) while issuing "
 586                                 "a packet command, retrying\n", drive->name);
 587                 udelay(100);
 588                 ireason = ide_read_ireason(drive);
 589                 if (retries == 0) {
 590                         printk(KERN_ERR PFX "%s: (IO,CoD != (0,1) while issuing"
 591                                         " a packet command, ignoring\n",
 592                                         drive->name);
 593                         ireason |= ATAPI_COD;
 594                         ireason &= ~ATAPI_IO;
 595                 }
 596         }
 597 
 598         return ireason;
 599 }
 600 
 601 static int ide_delayed_transfer_pc(ide_drive_t *drive)
 602 {
 603         /* Send the actual packet */
 604         drive->hwif->tp_ops->output_data(drive, NULL, drive->pc->c, 12);
 605 
 606         /* Timeout for the packet command */
 607         return WAIT_FLOPPY_CMD;
 608 }
 609 
 610 static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
 611 {
 612         struct ide_atapi_pc *uninitialized_var(pc);
 613         ide_hwif_t *hwif = drive->hwif;
 614         struct request *rq = hwif->rq;
 615         ide_expiry_t *expiry;
 616         unsigned int timeout;
 617         int cmd_len;
 618         ide_startstop_t startstop;
 619         u8 ireason;
 620 
 621         if (ide_wait_stat(&startstop, drive, ATA_DRQ, ATA_BUSY, WAIT_READY)) {
 622                 printk(KERN_ERR PFX "%s: Strange, packet command initiated yet "
 623                                 "DRQ isn't asserted\n", drive->name);
 624                 return startstop;
 625         }
 626 
 627         if (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT) {
 628                 if (drive->dma)
 629                         drive->waiting_for_dma = 1;
 630         }
 631 
 632         if (dev_is_idecd(drive)) {
 633                 /* ATAPI commands get padded out to 12 bytes minimum */
 634                 cmd_len = COMMAND_SIZE(scsi_req(rq)->cmd[0]);
 635                 if (cmd_len < ATAPI_MIN_CDB_BYTES)
 636                         cmd_len = ATAPI_MIN_CDB_BYTES;
 637 
 638                 timeout = rq->timeout;
 639                 expiry  = ide_cd_expiry;
 640         } else {
 641                 pc = drive->pc;
 642 
 643                 cmd_len = ATAPI_MIN_CDB_BYTES;
 644 
 645                 /*
 646                  * If necessary schedule the packet transfer to occur 'timeout'
 647                  * milliseconds later in ide_delayed_transfer_pc() after the
 648                  * device says it's ready for a packet.
 649                  */
 650                 if (drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) {
 651                         timeout = drive->pc_delay;
 652                         expiry = &ide_delayed_transfer_pc;
 653                 } else {
 654                         timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
 655                                                                : WAIT_TAPE_CMD;
 656                         expiry = NULL;
 657                 }
 658 
 659                 ireason = ide_read_ireason(drive);
 660                 if (drive->media == ide_tape)
 661                         ireason = ide_wait_ireason(drive, ireason);
 662 
 663                 if ((ireason & ATAPI_COD) == 0 || (ireason & ATAPI_IO)) {
 664                         printk(KERN_ERR PFX "%s: (IO,CoD) != (0,1) while "
 665                                 "issuing a packet command\n", drive->name);
 666 
 667                         return ide_do_reset(drive);
 668                 }
 669         }
 670 
 671         hwif->expiry = expiry;
 672 
 673         /* Set the interrupt routine */
 674         ide_set_handler(drive,
 675                         (dev_is_idecd(drive) ? drive->irq_handler
 676                                              : ide_pc_intr),
 677                         timeout);
 678 
 679         /* Send the actual packet */
 680         if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0)
 681                 hwif->tp_ops->output_data(drive, NULL, scsi_req(rq)->cmd, cmd_len);
 682 
 683         /* Begin DMA, if necessary */
 684         if (dev_is_idecd(drive)) {
 685                 if (drive->dma)
 686                         hwif->dma_ops->dma_start(drive);
 687         } else {
 688                 if (pc->flags & PC_FLAG_DMA_OK) {
 689                         pc->flags |= PC_FLAG_DMA_IN_PROGRESS;
 690                         hwif->dma_ops->dma_start(drive);
 691                 }
 692         }
 693 
 694         return ide_started;
 695 }
 696 
 697 ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd)
 698 {
 699         struct ide_atapi_pc *pc;
 700         ide_hwif_t *hwif = drive->hwif;
 701         ide_expiry_t *expiry = NULL;
 702         struct request *rq = hwif->rq;
 703         unsigned int timeout, bytes;
 704         u16 bcount;
 705         u8 valid_tf;
 706         u8 drq_int = !!(drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT);
 707 
 708         if (dev_is_idecd(drive)) {
 709                 valid_tf = IDE_VALID_NSECT | IDE_VALID_LBAL;
 710                 bcount = ide_cd_get_xferlen(rq);
 711                 expiry = ide_cd_expiry;
 712                 timeout = ATAPI_WAIT_PC;
 713 
 714                 if (drive->dma)
 715                         drive->dma = !ide_dma_prepare(drive, cmd);
 716         } else {
 717                 pc = drive->pc;
 718 
 719                 valid_tf = IDE_VALID_DEVICE;
 720                 bytes = blk_rq_bytes(rq);
 721                 bcount = ((drive->media == ide_tape) ? bytes
 722                                                      : min_t(unsigned int,
 723                                                              bytes, 63 * 1024));
 724 
 725                 /* We haven't transferred any data yet */
 726                 scsi_req(rq)->resid_len = bcount;
 727 
 728                 if (pc->flags & PC_FLAG_DMA_ERROR) {
 729                         pc->flags &= ~PC_FLAG_DMA_ERROR;
 730                         ide_dma_off(drive);
 731                 }
 732 
 733                 if (pc->flags & PC_FLAG_DMA_OK)
 734                         drive->dma = !ide_dma_prepare(drive, cmd);
 735 
 736                 if (!drive->dma)
 737                         pc->flags &= ~PC_FLAG_DMA_OK;
 738 
 739                 timeout = (drive->media == ide_floppy) ? WAIT_FLOPPY_CMD
 740                                                        : WAIT_TAPE_CMD;
 741         }
 742 
 743         ide_init_packet_cmd(cmd, valid_tf, bcount, drive->dma);
 744 
 745         (void)do_rw_taskfile(drive, cmd);
 746 
 747         if (drq_int) {
 748                 if (drive->dma)
 749                         drive->waiting_for_dma = 0;
 750                 hwif->expiry = expiry;
 751         }
 752 
 753         ide_execute_command(drive, cmd, ide_transfer_pc, timeout);
 754 
 755         return drq_int ? ide_started : ide_transfer_pc(drive);
 756 }
 757 EXPORT_SYMBOL_GPL(ide_issue_pc);

/* [<][>][^][v][top][bottom][index][help] */