-
-EXPORT_SYMBOL(flagged_taskfile);
-
-ide_startstop_t flagged_task_no_data_intr (ide_drive_t *drive)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat;
-
- local_irq_enable();
-
- if (!OK_STAT(stat = hwif->INB(IDE_STATUS_REG), READY_STAT, BAD_STAT)) {
- if (stat & ERR_STAT) {
- return DRIVER(drive)->error(drive, "flagged_task_no_data_intr", stat);
- }
- /*
- * (ks) Unexpected ATA data phase detected.
- * This should not happen. But, it can !
- * I am not sure, which function is best to clean up
- * this situation. I choose: ide_error(...)
- */
- return DRIVER(drive)->error(drive, "flagged_task_no_data_intr (unexpected phase)", stat);
- }
-
- ide_end_drive_cmd(drive, stat, hwif->INB(IDE_ERROR_REG));
-
- return ide_stopped;
-}
-
-/*
- * Handler for command with PIO data-in phase
- */
-ide_startstop_t flagged_task_in_intr (ide_drive_t *drive)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat = hwif->INB(IDE_STATUS_REG);
- struct request *rq = HWGROUP(drive)->rq;
- char *pBuf = NULL;
- int retries = 5;
-
- if (rq->current_nr_sectors == 0)
- return DRIVER(drive)->error(drive, "flagged_task_in_intr (no data requested)", stat);
-
- if (!OK_STAT(stat, DATA_READY, BAD_R_STAT)) {
- if (stat & ERR_STAT) {
- return DRIVER(drive)->error(drive, "flagged_task_in_intr", stat);
- }
- /*
- * (ks) Unexpected ATA data phase detected.
- * This should not happen. But, it can !
- * I am not sure, which function is best to clean up
- * this situation. I choose: ide_error(...)
- */
- return DRIVER(drive)->error(drive, "flagged_task_in_intr (unexpected data phase)", stat);
- }
-
- pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE);
- DTF("Read - rq->current_nr_sectors: %d, status: %02x\n", (int) rq->current_nr_sectors, stat);
-
- taskfile_input_data(drive, pBuf, SECTOR_WORDS);
-
- if (--rq->current_nr_sectors != 0) {
- /*
- * (ks) We don't know which command was executed.
- * So, we wait the 'WORSTCASE' value.
- */
- ide_set_handler(drive, &flagged_task_in_intr, WAIT_WORSTCASE, NULL);
- return ide_started;
- }
- /*
- * (ks) Last sector was transfered, wait until drive is ready.
- * This can take up to 10 usec. We willl wait max 50 us.
- */
- while (((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) && retries--)
- udelay(10);
- ide_end_drive_cmd (drive, stat, hwif->INB(IDE_ERROR_REG));
-
- return ide_stopped;
-}
-
-ide_startstop_t flagged_task_mulin_intr (ide_drive_t *drive)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat = hwif->INB(IDE_STATUS_REG);
- struct request *rq = HWGROUP(drive)->rq;
- char *pBuf = NULL;
- int retries = 5;
- unsigned int msect, nsect;
-
- if (rq->current_nr_sectors == 0)
- return DRIVER(drive)->error(drive, "flagged_task_mulin_intr (no data requested)", stat);
-
- msect = drive->mult_count;
- if (msect == 0)
- return DRIVER(drive)->error(drive, "flagged_task_mulin_intr (multimode not set)", stat);
-
- if (!OK_STAT(stat, DATA_READY, BAD_R_STAT)) {
- if (stat & ERR_STAT) {
- return DRIVER(drive)->error(drive, "flagged_task_mulin_intr", stat);
- }
- /*
- * (ks) Unexpected ATA data phase detected.
- * This should not happen. But, it can !
- * I am not sure, which function is best to clean up
- * this situation. I choose: ide_error(...)
- */
- return DRIVER(drive)->error(drive, "flagged_task_mulin_intr (unexpected data phase)", stat);
- }
-
- nsect = (rq->current_nr_sectors > msect) ? msect : rq->current_nr_sectors;
- pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE);
-
- DTF("Multiread: %p, nsect: %d , rq->current_nr_sectors: %ld\n",
- pBuf, nsect, rq->current_nr_sectors);
-
- taskfile_input_data(drive, pBuf, nsect * SECTOR_WORDS);
-
- rq->current_nr_sectors -= nsect;
- if (rq->current_nr_sectors != 0) {
- /*
- * (ks) We don't know which command was executed.
- * So, we wait the 'WORSTCASE' value.
- */
- ide_set_handler(drive, &flagged_task_mulin_intr, WAIT_WORSTCASE, NULL);
- return ide_started;
- }
-
- /*
- * (ks) Last sector was transfered, wait until drive is ready.
- * This can take up to 10 usec. We willl wait max 50 us.
- */
- while (((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) && retries--)
- udelay(10);
- ide_end_drive_cmd (drive, stat, hwif->INB(IDE_ERROR_REG));
-
- return ide_stopped;
-}
-
-/*
- * Pre handler for command with PIO data-out phase
- */
-ide_startstop_t flagged_pre_task_out_intr (ide_drive_t *drive, struct request *rq)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat = hwif->INB(IDE_STATUS_REG);
- ide_startstop_t startstop;
-
- if (!rq->current_nr_sectors) {
- return DRIVER(drive)->error(drive, "flagged_pre_task_out_intr (write data not specified)", stat);
- }
-
- if (ide_wait_stat(&startstop, drive, DATA_READY,
- BAD_W_STAT, WAIT_DRQ)) {
- printk(KERN_ERR "%s: No DRQ bit after issuing write command.\n", drive->name);
- return startstop;
- }
-
- taskfile_output_data(drive, rq->buffer, SECTOR_WORDS);
- --rq->current_nr_sectors;
-
- return ide_started;
-}
-
-ide_startstop_t flagged_task_out_intr (ide_drive_t *drive)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat = hwif->INB(IDE_STATUS_REG);
- struct request *rq = HWGROUP(drive)->rq;
- char *pBuf = NULL;
-
- if (!OK_STAT(stat, DRIVE_READY, BAD_W_STAT))
- return DRIVER(drive)->error(drive, "flagged_task_out_intr", stat);
-
- if (!rq->current_nr_sectors) {
- ide_end_drive_cmd (drive, stat, hwif->INB(IDE_ERROR_REG));
- return ide_stopped;
- }
-
- if (!OK_STAT(stat, DATA_READY, BAD_W_STAT)) {
- /*
- * (ks) Unexpected ATA data phase detected.
- * This should not happen. But, it can !
- * I am not sure, which function is best to clean up
- * this situation. I choose: ide_error(...)
- */
- return DRIVER(drive)->error(drive, "flagged_task_out_intr (unexpected data phase)", stat);
- }
-
- pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE);
- DTF("Write - rq->current_nr_sectors: %d, status: %02x\n",
- (int) rq->current_nr_sectors, stat);
-
- taskfile_output_data(drive, pBuf, SECTOR_WORDS);
- --rq->current_nr_sectors;
-
- /*
- * (ks) We don't know which command was executed.
- * So, we wait the 'WORSTCASE' value.
- */
- ide_set_handler(drive, &flagged_task_out_intr, WAIT_WORSTCASE, NULL);
-
- return ide_started;
-}
-
-ide_startstop_t flagged_pre_task_mulout_intr (ide_drive_t *drive, struct request *rq)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat = hwif->INB(IDE_STATUS_REG);
- char *pBuf = NULL;
- ide_startstop_t startstop;
- unsigned int msect, nsect;
-
- if (!rq->current_nr_sectors)
- return DRIVER(drive)->error(drive, "flagged_pre_task_mulout_intr (write data not specified)", stat);
-
- msect = drive->mult_count;
- if (msect == 0)
- return DRIVER(drive)->error(drive, "flagged_pre_task_mulout_intr (multimode not set)", stat);
-
- if (ide_wait_stat(&startstop, drive, DATA_READY,
- BAD_W_STAT, WAIT_DRQ)) {
- printk(KERN_ERR "%s: No DRQ bit after issuing write command.\n", drive->name);
- return startstop;
- }
-
- nsect = (rq->current_nr_sectors > msect) ? msect : rq->current_nr_sectors;
- pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE);
- DTF("Multiwrite: %p, nsect: %d , rq->current_nr_sectors: %ld\n",
- pBuf, nsect, rq->current_nr_sectors);
-
- taskfile_output_data(drive, pBuf, nsect * SECTOR_WORDS);
-
- rq->current_nr_sectors -= nsect;
-
- return ide_started;
-}
-
-ide_startstop_t flagged_task_mulout_intr (ide_drive_t *drive)
-{
- ide_hwif_t *hwif = HWIF(drive);
- u8 stat = hwif->INB(IDE_STATUS_REG);
- struct request *rq = HWGROUP(drive)->rq;
- char *pBuf = NULL;
- unsigned int msect, nsect;
-
- msect = drive->mult_count;
- if (msect == 0)
- return DRIVER(drive)->error(drive, "flagged_task_mulout_intr (multimode not set)", stat);
-
- if (!OK_STAT(stat, DRIVE_READY, BAD_W_STAT))
- return DRIVER(drive)->error(drive, "flagged_task_mulout_intr", stat);
-
- if (!rq->current_nr_sectors) {
- ide_end_drive_cmd (drive, stat, hwif->INB(IDE_ERROR_REG));
- return ide_stopped;
- }
-
- if (!OK_STAT(stat, DATA_READY, BAD_W_STAT)) {
- /*
- * (ks) Unexpected ATA data phase detected.
- * This should not happen. But, it can !
- * I am not sure, which function is best to clean up
- * this situation. I choose: ide_error(...)
- */
- return DRIVER(drive)->error(drive, "flagged_task_mulout_intr (unexpected data phase)", stat);
- }
-
- nsect = (rq->current_nr_sectors > msect) ? msect : rq->current_nr_sectors;
- pBuf = rq->buffer + ((rq->nr_sectors - rq->current_nr_sectors) * SECTOR_SIZE);
- DTF("Multiwrite: %p, nsect: %d , rq->current_nr_sectors: %ld\n",
- pBuf, nsect, rq->current_nr_sectors);
-
- taskfile_output_data(drive, pBuf, nsect * SECTOR_WORDS);
- rq->current_nr_sectors -= nsect;
-
- /*
- * (ks) We don't know which command was executed.
- * So, we wait the 'WORSTCASE' value.
- */
- ide_set_handler(drive, &flagged_task_mulout_intr, WAIT_WORSTCASE, NULL);
-
- return ide_started;
-}