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