• Home
  • Raw
  • Download

Lines Matching +full:i +full:- +full:drive

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2000-2002 Andre Hedrick <andre@linux-ide.org>
31 void SELECT_MASK(ide_drive_t *drive, int mask) in SELECT_MASK() argument
33 const struct ide_port_ops *port_ops = drive->hwif->port_ops; in SELECT_MASK()
35 if (port_ops && port_ops->maskproc) in SELECT_MASK()
36 port_ops->maskproc(drive, mask); in SELECT_MASK()
39 u8 ide_read_error(ide_drive_t *drive) in ide_read_error() argument
43 drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_ERROR); in ide_read_error()
53 int i; in ide_fix_driveid() local
55 for (i = 0; i < 256; i++) in ide_fix_driveid()
56 id[i] = __le16_to_cpu(id[i]); in ide_fix_driveid()
64 * ide_fixstring() cleans up and (optionally) byte-swaps a text string,
75 /* convert from big-endian to host byte order */ in ide_fixstring()
87 *p++ = *(s-1); in ide_fixstring()
96 * This routine busy-waits for the drive status to be not "busy".
99 * cases return error -- caller may then invoke ide_error().
102 * That could be done by busy-waiting for the first jiffy or two, and then
106 int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, in __ide_wait_stat() argument
109 ide_hwif_t *hwif = drive->hwif; in __ide_wait_stat()
110 const struct ide_tp_ops *tp_ops = hwif->tp_ops; in __ide_wait_stat()
113 int i; in __ide_wait_stat() local
116 udelay(1); /* spec allows drive 400ns to assert "BUSY" */ in __ide_wait_stat()
117 stat = tp_ops->read_status(hwif); in __ide_wait_stat()
125 while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) { in __ide_wait_stat()
132 stat = tp_ops->read_status(hwif); in __ide_wait_stat()
139 return -EBUSY; in __ide_wait_stat()
152 for (i = 0; i < 10; i++) { in __ide_wait_stat()
154 stat = tp_ops->read_status(hwif); in __ide_wait_stat()
162 return -EFAULT; in __ide_wait_stat()
170 int ide_wait_stat(ide_startstop_t *startstop, ide_drive_t *drive, u8 good, in ide_wait_stat() argument
177 if (drive->max_failures && (drive->failures > drive->max_failures)) { in ide_wait_stat()
182 err = __ide_wait_stat(drive, good, bad, timeout, &stat); in ide_wait_stat()
185 char *s = (err == -EBUSY) ? "status timeout" : "status error"; in ide_wait_stat()
186 *startstop = ide_error(drive, s, stat); in ide_wait_stat()
194 * ide_in_drive_list - look for drive in black/white list
195 * @id: drive identifier
198 * Look for a drive in the blacklist and the whitelist tables
199 * Returns 1 if the drive is found in the table.
204 for ( ; table->id_model; table++) in ide_in_drive_list()
205 if ((!strcmp(table->id_model, (char *)&id[ATA_ID_PROD])) && in ide_in_drive_list()
206 (!table->id_firmware || in ide_in_drive_list()
207 strstr((char *)&id[ATA_ID_FW_REV], table->id_firmware))) in ide_in_drive_list()
220 { "TSSTcorp CDDVDW SH-S202J" , "SB00" },
221 { "TSSTcorp CDDVDW SH-S202J" , "SB01" },
222 { "TSSTcorp CDDVDW SH-S202N" , "SB00" },
223 { "TSSTcorp CDDVDW SH-S202N" , "SB01" },
224 { "TSSTcorp CDDVDW SH-S202H" , "SB00" },
225 { "TSSTcorp CDDVDW SH-S202H" , "SB01" },
226 { "SAMSUNG SP0822N" , "WA100-10" },
234 u8 eighty_ninty_three(ide_drive_t *drive) in eighty_ninty_three() argument
236 ide_hwif_t *hwif = drive->hwif; in eighty_ninty_three()
237 u16 *id = drive->id; in eighty_ninty_three()
240 if (hwif->cbl == ATA_CBL_SATA || hwif->cbl == ATA_CBL_PATA40_SHORT) in eighty_ninty_three()
245 drive->name); in eighty_ninty_three()
250 if (hwif->cbl != ATA_CBL_PATA80 && !ivb) in eighty_ninty_three()
255 * - change master/slave IDENTIFY order in eighty_ninty_three()
256 * - force bit13 (80c cable present) check also for !ivb devices in eighty_ninty_three()
257 * (unless the slave device is pre-ATA3) in eighty_ninty_three()
265 if (strstr(model, "TSSTcorp CDDVDW SH-S202")) { in eighty_ninty_three()
270 if (hwif->cbl == ATA_CBL_PATA80) in eighty_ninty_three()
279 if (drive->dev_flags & IDE_DFLAG_UDMA33_WARNED) in eighty_ninty_three()
282 printk(KERN_WARNING "%s: %s side 80-wire cable detection failed, " in eighty_ninty_three()
284 drive->name, in eighty_ninty_three()
285 hwif->cbl == ATA_CBL_PATA80 ? "drive" : "host"); in eighty_ninty_three()
287 drive->dev_flags |= IDE_DFLAG_UDMA33_WARNED; in eighty_ninty_three()
305 void ide_check_nien_quirk_list(ide_drive_t *drive) in ide_check_nien_quirk_list() argument
307 const char **list, *m = (char *)&drive->id[ATA_ID_PROD]; in ide_check_nien_quirk_list()
311 drive->dev_flags |= IDE_DFLAG_NIEN_QUIRK; in ide_check_nien_quirk_list()
316 int ide_driveid_update(ide_drive_t *drive) in ide_driveid_update() argument
325 SELECT_MASK(drive, 1); in ide_driveid_update()
326 rc = ide_dev_read_id(drive, ATA_CMD_ID_ATA, id, 1); in ide_driveid_update()
327 SELECT_MASK(drive, 0); in ide_driveid_update()
332 drive->id[ATA_ID_UDMA_MODES] = id[ATA_ID_UDMA_MODES]; in ide_driveid_update()
333 drive->id[ATA_ID_MWDMA_MODES] = id[ATA_ID_MWDMA_MODES]; in ide_driveid_update()
334 drive->id[ATA_ID_SWDMA_MODES] = id[ATA_ID_SWDMA_MODES]; in ide_driveid_update()
335 drive->id[ATA_ID_CFA_MODES] = id[ATA_ID_CFA_MODES]; in ide_driveid_update()
343 printk(KERN_ERR "%s: %s: bad status\n", drive->name, __func__); in ide_driveid_update()
348 int ide_config_drive_speed(ide_drive_t *drive, u8 speed) in ide_config_drive_speed() argument
350 ide_hwif_t *hwif = drive->hwif; in ide_config_drive_speed()
351 const struct ide_tp_ops *tp_ops = hwif->tp_ops; in ide_config_drive_speed()
353 u16 *id = drive->id, i; in ide_config_drive_speed() local
358 if (hwif->dma_ops) /* check if host supports DMA */ in ide_config_drive_speed()
359 hwif->dma_ops->dma_host_set(drive, 0); in ide_config_drive_speed()
362 /* Skip setting PIO flow-control modes on pre-EIDE drives */ in ide_config_drive_speed()
363 if ((speed & 0xf8) == XFER_PIO_0 && ata_id_has_iordy(drive->id) == 0) in ide_config_drive_speed()
367 * Don't use ide_wait_cmd here - it will in ide_config_drive_speed()
374 tp_ops->dev_select(drive); in ide_config_drive_speed()
375 SELECT_MASK(drive, 1); in ide_config_drive_speed()
377 tp_ops->write_devctl(hwif, ATA_NIEN | ATA_DEVCTL_OBS); in ide_config_drive_speed()
383 tp_ops->tf_load(drive, &tf, IDE_VALID_FEATURE | IDE_VALID_NSECT); in ide_config_drive_speed()
385 tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES); in ide_config_drive_speed()
387 if (drive->dev_flags & IDE_DFLAG_NIEN_QUIRK) in ide_config_drive_speed()
388 tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); in ide_config_drive_speed()
390 error = __ide_wait_stat(drive, drive->ready_stat, in ide_config_drive_speed()
394 SELECT_MASK(drive, 0); in ide_config_drive_speed()
397 (void) ide_dump_status(drive, "set_drive_speed_status", stat); in ide_config_drive_speed()
412 if (speed >= XFER_SW_DMA_0 && (drive->dev_flags & IDE_DFLAG_USING_DMA)) in ide_config_drive_speed()
413 hwif->dma_ops->dma_host_set(drive, 1); in ide_config_drive_speed()
414 else if (hwif->dma_ops) /* check if host supports DMA */ in ide_config_drive_speed()
415 ide_dma_off_quietly(drive); in ide_config_drive_speed()
419 i = 1 << (speed - XFER_UDMA_0); in ide_config_drive_speed()
420 id[ATA_ID_UDMA_MODES] |= (i << 8 | i); in ide_config_drive_speed()
422 i = speed - XFER_MW_DMA_2; in ide_config_drive_speed()
423 id[ATA_ID_CFA_MODES] |= i << 9; in ide_config_drive_speed()
425 i = 1 << (speed - XFER_MW_DMA_0); in ide_config_drive_speed()
426 id[ATA_ID_MWDMA_MODES] |= (i << 8 | i); in ide_config_drive_speed()
428 i = 1 << (speed - XFER_SW_DMA_0); in ide_config_drive_speed()
429 id[ATA_ID_SWDMA_MODES] |= (i << 8 | i); in ide_config_drive_speed()
431 i = speed - XFER_PIO_4; in ide_config_drive_speed()
432 id[ATA_ID_CFA_MODES] |= i << 6; in ide_config_drive_speed()
435 if (!drive->init_speed) in ide_config_drive_speed()
436 drive->init_speed = speed; in ide_config_drive_speed()
437 drive->current_speed = speed; in ide_config_drive_speed()
443 * wait for an interrupt response from a drive. handler() points
450 void __ide_set_handler(ide_drive_t *drive, ide_handler_t *handler, in __ide_set_handler() argument
453 ide_hwif_t *hwif = drive->hwif; in __ide_set_handler()
455 BUG_ON(hwif->handler); in __ide_set_handler()
456 hwif->handler = handler; in __ide_set_handler()
457 hwif->timer.expires = jiffies + timeout; in __ide_set_handler()
458 hwif->req_gen_timer = hwif->req_gen; in __ide_set_handler()
459 add_timer(&hwif->timer); in __ide_set_handler()
462 void ide_set_handler(ide_drive_t *drive, ide_handler_t *handler, in ide_set_handler() argument
465 ide_hwif_t *hwif = drive->hwif; in ide_set_handler()
468 spin_lock_irqsave(&hwif->lock, flags); in ide_set_handler()
469 __ide_set_handler(drive, handler, timeout); in ide_set_handler()
470 spin_unlock_irqrestore(&hwif->lock, flags); in ide_set_handler()
475 * ide_execute_command - execute an IDE command
476 * @drive: IDE drive to issue the command against
487 void ide_execute_command(ide_drive_t *drive, struct ide_cmd *cmd, in ide_execute_command() argument
490 ide_hwif_t *hwif = drive->hwif; in ide_execute_command()
493 spin_lock_irqsave(&hwif->lock, flags); in ide_execute_command()
494 if ((cmd->protocol != ATAPI_PROT_DMA && in ide_execute_command()
495 cmd->protocol != ATAPI_PROT_PIO) || in ide_execute_command()
496 (drive->atapi_flags & IDE_AFLAG_DRQ_INTERRUPT)) in ide_execute_command()
497 __ide_set_handler(drive, handler, timeout); in ide_execute_command()
498 hwif->tp_ops->exec_command(hwif, cmd->tf.command); in ide_execute_command()
500 * Drive takes 400nS to respond, we must avoid the IRQ being in ide_execute_command()
506 spin_unlock_irqrestore(&hwif->lock, flags); in ide_execute_command()
511 * to report a non-busy status, see comments in ide_probe_port().
517 while (timeout--) { in ide_wait_not_busy()
519 * Turn this into a schedule() sleep once I'm sure in ide_wait_not_busy()
523 stat = hwif->tp_ops->read_status(hwif); in ide_wait_not_busy()
528 * the interface and it doesn't implement the pull-down in ide_wait_not_busy()
532 return -ENODEV; in ide_wait_not_busy()
535 return -EBUSY; in ide_wait_not_busy()