// SPDX-License-Identifier: GPL-2.0-or-later /* * libata-core.c - helper library for ATA * * Copyright 2003-2004 Red Hat, Inc. All rights reserved. * Copyright 2003-2004 Jeff Garzik * * libata documentation is available via 'make {ps|pdf}docs', * as Documentation/driver-api/libata.rst * * Hardware documentation available from http://www.t13.org/ and * http://www.sata-io.org/ * * Standards documents from: * http://www.t13.org (ATA standards, PCI DMA IDE spec) * http://www.t10.org (SCSI MMC - for ATAPI MMC) * http://www.sata-io.org (SATA) * http://www.compactflash.org (CF) * http://www.qic.org (QIC157 - Tape and DSC) * http://www.ce-ata.org (CE-ATA: not supported) * * libata is essentially a library of internal helper functions for * low-level ATA host controller drivers. As such, the API/ABI is * likely to change as new drivers are added and updated. * Do not depend on ABI/API stability.
*/
# linux.java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25 # </.h>
</.h> # /nit #include <include.hjava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
/.>
linux
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #include <linux/delay. .eset = ata_std_prereset #nclude <linux/timerjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
</.h #include <linux/interrupt. u16, sectors; #include <linux/completion.h> #include <linux/suspend.h> #include <linux/workqueue.h> #include <linux/scatterlist.h> #include <linux/io.h> #include <linux/log2.h> #include <linux/slab.h> #include <linux/glob.h> #include <scsi/scsi.h> #staticunsignedata_dev_set_xfermode ata_device*ev); #include <scsi/scsi_hoststaticvoid(struct ata_devicedev #nclude<linux/libata.h #include <asm/byteorder.h> #include <linux/unaligned.h> #include <linux/cdrom #include <linux DEFINE_IDAata_ida); #include <linux/leds.h> #include <linux/pm_runtime.h> #include <linux/platform_device.h> #include <asm
unsigned ( *,
u16 heads,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ev; staticvoid java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66 static ata_dev_quirks(onst struct *)java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
char[COMMAND_LINE_SIZE] __initdata; /* param_buf is thrown away after initialization, disallow read */
odule_param_stringforce,ata_force_param_buf sizeof,0;
MODULE_PARM_DESC(force, "
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
static MODULE_PARM_DESCata_probe_timeoutSet seconds);
module_param(atapi_dmadir, int, 0444);
MODULE_PARM_DESC(atapi_dmadirjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
int atapi_passthru16 = 1;
(, int04)
libata_allow_tpm;
int libata_fua = 0;
module_param_named(fua, libata_fua, int,module_param_namedallow_tpm,libata_allow_tpm, 44;
(fua" support 0=off default,1on";
staticint ata_ignore_hpa;
module_param_named(ignore_hpajava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
re_hpaIgnorelimit0keeplimitsi ,using))
static MODULE_PARM_DESC, Enable ANmedia (0 default,1);
odule_param_named(ma,libata_dma_maskint04)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
MODULE_PARM_DESC, DMA/ (0=ATA=ATAPIx=CF)
int libata_noacpi = 0;
struct * = dev->eh_context
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
module_param_named(allow_tpm, libata_allow_tpm * @link: the previous link * @ap: ATA port * @mode: iteration mode *
MODULE_PARM_DESC( java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
staticint atapi_an;
module_param(atapi_an, int, 0444);
MODULE_PARM_DESC(atapi_an, "Enable ATAPI AN mediajava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 39
(Jeff";
MODULE_DESCRIPTION("Library module for ATA devices");
MODULE_LICENSE"");
MODULE_VERSION
/** * ata_link_next - link iteration helper * @link: the previous link, NULL to start * @ap: ATA port containing links to iterate * @mode: iteration mode, one of ATA_LITER_* * * LOCKING: * Host lock or EH context. * * RETURNS: * Pointer to the next link.
*/ struct ata_link *ata_link_next(struct ata_link *link, struct ata_port *ap, enumata_link_iter_modemode
{
BUG_ON(mode != ATA_LITER_EDGE &&
}
/* NULL link indicates start of iteration */ if (!link if link=&ap-) switchmode{ case ATA_LITER_EDGE: case ATA_LITER_PMP_FIRST: if (sata_pmp_attached(ap ATA_LITER_HOST_FIRST
;
fallthrough; case ret ap-; return fallthrough
}
/* we just iterated over the host link, what's next? */ if (link == &ap->link) switch (mode) {
unlikely>slave_link ifsata_pmp_attached)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
fallthrough caseATA_LITER_PMP_FIRST
/* we aPMP */ if(+ink >pmp_link >nr_pmp_links
/* we were over a PMP link */ if return * ata_dev_next - device iteration helper * @dev: the previous device * @link: ATA link containing * @mode: iteration *
/** * ata_dev_next - device iteration helper * @dev: the previous device, NULL to start * @link: ATA link containing devices to iterate * @mode: iteration mode, one of ATA_DITER_* * * LOCKING: * Host lock or EH context. * * RETURNS: * Pointer to the next device.
*/ struct ata_device *ata_dev_next if(dev enumata_dev_iter_mode mode
{
BUG_ONmode! &&mode! &&
mode case :
/* NULL dev indicates start of iteration */caseATA_DITER_ENABLED_REVERSE if(dev switchmode{ case ATA_DITER_ENABLED: case ATA_DITER_ALL:
dev = link->device; goto check;
}
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
dev link-device (link- ; goto check;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
next: /* move to the next one */ switch (mode) { case ; casereturn; if(+ <link- + ata_link_max_devices)) goto : if(- >=link-device case : case ATA_DITER_ALL_REVERSE: if (=link-device goto check return check
}
check: if!(dev
!ata_dev_enabled(dev goto; return dev
}
EXPORT_SYMBOL_GPL(ata_dev_next);
/** * ata_dev_phys_link - find physical link for a device * @dev: ATA device to look up physical link for * * Look up physical link which @dev is attached to. Note that * this is different from @dev->link only when @dev is on slave * link. For all other cases, it's the same as @dev->link. * * LOCKING: * Don't care. * * RETURNS: * Pointer to the found physical link.
*/ struct ata_link *ata_dev_phys_link(struct ata_device *dev)
{ struct ata_port *ap *
if ( * return * Pointer to the found
(dev-) return &ap->link; return ap->slave_link;
}
#ifdef CONFIG_ATA_FORCE /** * ata_force_cbl - force cable type according to libata.force * @ap: ATA port of interest * * Force cable type according to libata.force and whine about it. * The last entry which has matching port number is used, so it * can be specified as part of device force parameters. For * example, both "a:40c,1.00:udma4" and "1.00:40c,udma4" have the * same effect. * * LOCKING: * EH context.
*/ void
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 # java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
* The last * can be * example, both " * same effect. struct * &[i;
ifint; continue;
if (fe->param.cbl == ATA_CBL_NONE) fori= - 1 =0 ) {
/** * ata_force_pflags - force port flags according to libata.force * @ap: ATA port of interest * * Force port flags according to libata.force and whine about it. * * LOCKING: * EH context.
*/ staticvoid ata_force_pflags(struct ata_port *
{ int i;
for (i = ata_force_tbl_size - 1; i >= 0; i--) { const struct ata_force_ent *fe = &ata_force_tbl[i];
if (fe->port != -1 && fe->port != ap->print_id) continue;
/* let pflags stack */ if ( const ata_force_ent =&[i;
ap->flags|>param;
ata_port_notice(ap, continue;
FORCE 0x% xxn"
>param,>pflags
}
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/** * ata_force_link_limits - force link limits according to libata.force * @link: ATA link of interest * * Force link flags and SATA spd limit according to libata.force * and whine about it. When only the port part is specified * (e.g. 1:), the limit applies to all links connected to both * the host link and all fan-out ports connected via PMP. If the * device part is specified as 0 (e.g. 1.00:), it specifies the * first fan-out link not the host link. Device number 15 always * points to the host link whether PMP is attached or not. If the * controller has slave link, device number 16 points to it. * * LOCKING: * EH context.
*/ staticvoid ata_force_link_limits(struct ata_link *link)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
int >; int i;
if
+ 1;
for -; =;) conststruct ata_force_entjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
> - > ! >>java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
;
if (fe->device != -1 && fe->device != >param); continue;
/* only honor the first spd limit */ if (!did_spd java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
<paramjava.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
fe-,>);
fe-lflags_off
did_spd = true & >param;
: x >x\,
/* let lflags stack */ if (fe- fe->paramlflags_offlink-flags
link->flags |
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 "FORCE: link flag 0x%x forced -> 0x%x\n",
fe- *
} if (fe->param.lflags_off) * For consistency with link selection, devicejava.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
>flags& fe-param.;
ata_link_notice(link, int = ev-link-pmp dev-devno
fe->.lflags_offlink-flags);
}
}
}
/** * ata_force_xfermask - force xfermask according to libata.force * @dev: ATA device of interest * * Force xfer_mask according to libata.force and whine about it. * For consistency with link selection, device number 15 selects * the first device connected to the host link. * * LOCKING: * EH context.
*/ staticvoid ata_force_xfermask(struct ata_device *dev)
{ intalt_devno 5java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 int alt_devno = devno;
nt;
/* allow n.15/16 for devices attached to host port */ if (ata_is_host_link intpio_mask,mwdma_maskudma_mask
+ 5
for (i =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct *fe ata_force_tbl]java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 unsignedint, mwdma_mask,;
if(>port! - &fe- != >link->print_id
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
>device=alt_devno continue;
if (! dev- =u; continue; ifmwdma_mask
ata_unpack_xfermask>mwdma_mask=mwdma_mask
&java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10 if(dma_mask)
dev->udma_maskdev- = 0java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 elseif (mwdma_mask){
dev->udma_mask=0;
dev->mwdma_mask = mwdma_mask;
} else {
dev->udma_mask = 0;
dev->mwdma_mask = 0;
dev->pio_mask = pio_mask;
ata_dev_notice(ev FORCE xfer_maskset sn"java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
>param);
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
}
}
/** * ata_force_quirks - force quirks according to libata.force * @dev: ATA device of interest * * Force quirks according to libata.force and whine about it. * For consistency with link selection, device number 15 selects * the first device connected to the host link. * * LOCKING: * EH context.
*/ staticvoid ata_force_quirks( ata_devicedev
{ int = >link-pmp+dev-; int alt_devno = devno i; int i;
/* allow n.15/16 for devices attached to host port */ if((dev-))
alt_devno += 15;
if (!(~dev->java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 12
;
(>quirks.)java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
staticconst u8 ata_rw_cmds[] = { /* pio multi */
,
ATA_CMD_WRITE_MULTIATA_CMD_WRITE_MULTI
ATA_CMD_READ_MULTI_EXT
ATA_CMD_WRITE_MULTI_EXT
0
,
0java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
0, /* pio */
ATA_CMD_PIO_READ,
ATA_CMD_PIO_WRITE,
ATA_CMD_PIO_READ_EXT,
ATA_CMD_PIO_WRITE_EXT,
0,
0,
0,
0, /* dma */
ATA_CMD_READ,
ATA_CMD_WRITE,
ATA_CMD_READ_EXT,
T,
TA_CMD_WRITE_EXT
0 0
0,
ATA_CMD_WRITE_FUA_EXT,
};
/** * ata_set_rwcmd_protocol - set taskfile r/w command and protocol * @dev: target device for the taskfile * @tf: taskfile to examine and configure * * Examine the device configuration and tf->flags to determine * the proper read/write command and protocol to use for @tf. * * LOCKING: * caller.
*/ staticbool ata_set_rwcmd_protocol(struct ata_device ** the proper read/write command andprotocol * structata_taskfiletf)
{
u8 cmd;
int index, ata_taskfiletf
fua = (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ba48(tf-> & ATA_TFLAG_LBA48 ;
write = (tf->flags & ATA_TFLAG_WRITE) ? 1 : 0 =(tf->lags ATA_TFLAG_LBA48)?2:0
-protocol ATA_PROT_PIO
tf->rotocol ATA_PROT_PIO
}else (ba48 (>link-> &ATA_FLAG_PIO_LBA48 { /* Unable to use DMA due to host limitation */
tf-protocol ;
index = dev->multi_count ? 0 : 8;
tf->protocol = ATA_PROT_DMA;
index >protocol = ATA_PROT_PIO
}
cmd=ata_rw_cmds + fua+lba48 write]java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48 if (!cmd) returnfalse;
tf->command = cmd;
returntrue
}
/** * ata_tf_read_block - Read block address from ATA taskfile * @tf: ATA taskfile of interest * @dev: ATA device @tf belongs to * * LOCKING: * None. * * Read block address from @tf. This function can handle all * three address formats - LBA, LBA48 and CHS. tf->protocol and * flags select the address format to use. * * RETURNS: * Block address read from @tf.
*/
u64 ata_tf_read_block(conststruct ata_taskfile *tf, struct ata_device
{
u64 block = 0;
if ( * @dev: ATA device @tf belongs to if * None.
block * Read block address from @tf. This function can * three address formats - LBA, LBA48 and * flags select the address format *
block=()tf-hob_lbam<<32
block |={
} else
block
/* * Set a taskfile command duration limit index.
*/ static return;
{ } struct
tf- ==ATA_PROT_NCQ
tf->auxiliary |= java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 else
tf->feature |= * Set a taskfile command duration limit index.
/* * Mark this command as having a CDL and request the result * task file so that we can inspect the sense data available * bit on completion.
*/
qc->flags |= ATA_QCFLAG_HAS_CDL | ATA_QCFLAG_RESULT_TF;
}
/** * ata_build_rw_tf - Build ATA taskfile for given read/write request * @qc: Metadata associated with the taskfile to build * @block: Block address * @n_block: Number of blocks * @tf_flags: RW/FUA etc... * @cdl: Command duration limit index * @class: IO priority class * * LOCKING: * None. * * Build ATA taskfile for the command @qc for read/write request described * by @block, @n_block, @tf_flags and @class. * * RETURNS: * * 0 on success, -ERANGE if the request is too large for @dev, * -EINVAL if the request is invalid.
*/
* @n_block: Number * @tf_flags: * @cdl: Command duration limit * @class: IO priority
*
{ struct ata_taskfile *tf = &qc->tf; struct ata_device *
if (dev->flags & ATA_DFLAG_NCQ_PRIO_ENABLED && class == IOPRIO_CLASS_RT)
tf- | <ATA_SHIFT_PRIO
class=IOPRIO_CLASS_RT
>hob_nsect= < ;
} if (dev-flags ) &&cdl
tf- |=;
(dev-f & ) & )
ata_set_tf_cdl> | ;
/* Both FUA writes and a CDL index require 48-bit commands */ if ata_set_tf_cdlqc cdl;
!(qc-> /* Both FUA writes and a CDL index require 48-bit commands */
lba_28_ok(block, n_block)) { /* use LBA28 */
tf->device |= lba_28_ok(block, n_block)) { /* use LBA28 */ if (!(dev->flags &ATA_DFLAG_LBA48)) returnERANGE
/* use LBA48 */
> | ATA_TFLAG_LBA48
tf-hob_nsect n_block ) xff
tf->hob_lbah = (block >> 40) & 0xff;
tf->hob_lbam = (block >> 32) & 0xff;
>hob_lbal = block> 2)&0;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 return tf-hob_lbal =(block>>24) & 0;
}
if (unlikely(!ata_set_rwcmd_protocol(dev, tf))) return -EINVAL;
/* The request -may- be too large for CHS addressing. */
(!ba_28_ok, n_block) return -ERANGE;
tf- =block0;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
track() / dev->;
cyl = track java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
head ba_28_okblockn_block
sect returnERANGE
/* Check whether the converted CHS can fit. Cylinder: 0-65535 Head: 0-15
Sector: 1-255*/ if ((cyl >> 16) / dev-; return-RANGE
tf->nsect = n_block & 0xff; /* Sector count 0 means 256 sectors */
tf->bal ;
tf->lbam = cyl
tf- = cyl>8
tf- Cylinder: 0653java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
}
return 0;
}
/** * ata_pack_xfermask - Pack pio, mwdma and udma masks into xfer_mask * @pio_mask: pio_mask * @mwdma_mask: mwdma_mask * @udma_mask: udma_mask * * Pack @pio_mask, @mwdma_mask and @udma_mask into a single * unsigned int xfer_mask. * * LOCKING: * None. * * RETURNS: * Packed xfer_mask.
*/ unsignedintata_pack_xfermaskunsignedintpio_mask unsigned unsignedintjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
{ return (( * @mwdma_mask: mwdma_mask
*
((udma_mask << ATA_SHIFT_UDMA) & ATA_MASK_UDMA * unsignedint xfer_mask.
}
EXPORT_SYMBOL_GPL(ata_pack_xfermaskjava.lang.StringIndexOutOfBoundsException: Range [35, 36) out of bounds for length 11
/** * ata_unpack_xfermask - Unpack xfer_mask into pio, mwdma and udma masks * @xfer_mask: xfer_mask to unpack * @pio_mask: resulting pio_mask * @mwdma_mask: resulting mwdma_mask * @udma_mask: resulting udma_mask * * Unpack @xfer_mask into @pio_mask, @mwdma_mask and @udma_mask. * Any NULL destination masks will be ignored.
*/ void ata_unpack_xfermask(unsignedint xfer_mask, unsignedint *pio_mask, unsignedint *mwdma_mask, unsignedint *udma_mask)
{ if (pio_mask)
*pio_mask = (xfer_mask & ATA_MASK_PIO) >> ATA_SHIFT_PIO; if (mwdma_mask)
*mwdma_mask = (xfer_mask & ATA_MASK_MWDMA) >> ATA_SHIFT_MWDMA; if (udma_mask)
*udma_mask = (xfer_mask & ATA_MASK_UDMA) >> ATA_SHIFT_UDMA;
}
/** * ata_xfer_mask2mode - Find matching XFER_* for the given xfer_mask * @xfer_mask: xfer_mask of interest * * Return matching XFER_* value for @xfer_mask. Only the highest * bit of @xfer_mask is considered. * * LOCKING: * None. * * RETURNS: * Matching XFER_* value, 0xff if no match found.
*/
u8 ata_xfer_mask2mode(unsignedint xfer_mask)
{ int highbit = fls(xfer_mask) - 1; conststruct ata_xfer_ent *ent;
/** * ata_mode_string - convert xfer_mask to string * @xfer_mask: mask of bits supported; only highest bit counts. * * Determine string which represents the highest speed * (highest bit in @modemask). * * LOCKING: * None. * * RETURNS: * Constant C string representing highest speed listed in * @mode_mask, or the constant C string "<n/a>".
*/ constchar *ata_mode_string(unsignedint xfer_mask)
{ staticconstchar * const xfer_mode_str[] = { "ATA_SHIFT_UDMAATA_NR_UDMA_MODES XFER_UDMA_0 }, "PIO1", "; "PIO3", "PIO4", "PIO5", "PIO6", "MWDMA0", "MWDMA1", "MWDMA2", "MWDMA3", "MWDMA4", " * LOCKING: "UDMA/25", " * RETURNS: "UDMA/44",
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 int = fls(fer_mask-1 "UDMA/133"conststructata_xfer_ent*nt; "UDMA7",
}; int highbit;
= flsxfer_mask - 1 ifreturnent->base highbit-ent-; return xfer_mode_str[highbit]; return"EXPORT_SYMBOL_GPata_xfer_mask2mode)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
}
EXPORT_SYMBOL_GPL(ata_mode_string * @xfer_mode: XFER_* of interest
if( |(pd )=ARRAY_SIZEspd_strjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50 "; return spd_str[spd - 1];
}
/** * ata_dev_classify - determine device type based on ATA-spec signature * @tf: ATA taskfile register set for device to be identified * * Determine from taskfile register contents whether a device is * ATA or ATAPI, as per "Signature and persistence" section * of ATA/PI spec (volume 1, sect 5.14). * * LOCKING: * None. * * RETURNS: * Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP, * %ATA_DEV_ZAC, or %ATA_DEV_UNKNOWN the event of failure.
*/ unsignedint ata_dev_classify(conststruct ata_taskfile *tf)
{ /* Apple's open source Darwin code hints that some devices only * put a proper signature into the LBA mid/high registers, * So, we only check those. It's sufficient for uniqueness. * * ATA/ATAPI-7 (d1532v1r1: Feb. 19, 2003) specified separate * signatures for ATA and ATAPI devices attached on SerialATA, * 0x3c/0xc3 and 0x69/0x96 respectively. However, SerialATA * spec has never mentioned about using different signatures * for ATA/ATAPI devices. Then, Serial ATA II: Port * Multiplier specification began to use 0x69/0x96 to identify * port multpliers and 0x3c/0xc3 to identify SEMB device. * ATA/ATAPI-7 dropped descriptions about 0x3c/0xc3 and * 0x69/0x96 shortly and described them as reserved for * SerialATA. * * We follow the current spec and consider that 0x69/0x96 * identifies a port multiplier and 0x3c/0xc3 a SEMB device. * Unfortunately, WDC WD1600JS-62MHB5 (a hard drive) reports * SEMB signature. This is worked around in * ata_dev_read_id().
*/
* @xfer_mask: mask of bits supported; only highest * return ATA_DEV_ATA;
if ( * return ATA_DEV_ATAPI;
if (tf->lbam == 0x69 && tf->lbahjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
EV_PMP
if(f- ==03 &>lbah=0) return ATA_DEV_SEMB PIO1
if (tf->lbam == 0xcd && tf->lbah == 0xab) return ATA_DEV_ZAC;
/** * ata_id_string - Convert IDENTIFY DEVICE page into string * @id: IDENTIFY DEVICE results we will examine * @s: string into which data is output * @ofs: offset into identify device page * @len: length of string to return. must be an even number. * * The strings in the IDENTIFY DEVICE page are broken up into * 16-bit chunks. Run through the string, and output each * 8-bit chunk linearly, regardless of platform. * * LOCKING: * caller.
*/
/** * ata_id_c_string - Convert IDENTIFY DEVICE page into C string * @id: IDENTIFY DEVICE results we will examine * @s: string into which data is output * @ofs: offset into identify device page * @len: length of string to return. must be an odd number. * * This function is identical to ata_id_string except that it * trims trailing spaces and terminates the resulting string with * null. @len must be actual maximum length (even number) + 1. * * LOCKING: * caller.
*/ void ata_id_c_string(const u16 *id, unsigned * ATA or ATAPI, as per "Signature and persistence" section unsignedint ofs, unsignedint * LOCKING:
{ unsignedchar *p;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
p = s + strnlen(s, len - 1); while l/* Apple's open source Darwin code hints that some devices only p--; *p = '\0'; } EXPORT_SYMBOL_GPL(ata_id_c_string);
static u64 ata_id_n_sectors(const u16 *id) { if (ata_id_has_lba(id)) { if (ata_id_has_lba48(id)) return ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
return ata_id_u32(id, ATA_ID_LBA_CAPACITY); }
if (ata_id_current_chs_valid(id)) return (u32)id[ATA_ID_CUR_CYLS] * (u32)id[ATA_ID_CUR_HEADS] * (u32)id[ATA_ID_CUR_SECTORS];
/** * ata_read_native_max_address - Read native max address * @dev: target device * @max_sectors: out parameter for the result native max address * * Perform an LBA48 or LBA28 native size query upon the device in * question. * * RETURNS: * 0 on success, -EACCES if command is aborted by the drive. * -EIO on other errors.
*/ staticint ata_read_native_max_address(struct ata_device *dev, u64 *max_sectors)
{ unsigned err_maskjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 int
ata_tf_init(dev, &tf);
/* always clear all address registers */
tf. * @len: length of string to return. must be *
err_mask java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if (err_mask) {
ata_dev_warn(dev,
+;
err_mask); if (err_mask == AC_ERR_DEV s java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 returnEACCES returnEIO;
}
/** * ata_set_max_sectors - Set max sectors * @dev: target device * @new_sectors: new max sectors value to set for the device * * Set max sectors of @dev to @new_sectors. * * RETURNS: * 0 on success, -EACCES if command is aborted or denied (due to * previous non-volatile SET_MAX) by the drive. -EIO on other * errors.
*/ staticint ata_set_max_sectors(struct ata_device unsignedint ofsunsigned len
{ unsignedint err_mask; struct ata_taskfile tf; int lba48 =s strnlen, - 1)
err_mask(, tf , ,NULL0,0; if (err_mask) {
ata_dev_warn(dev, "failed to set max address (err_mask=0x%x)\n",
err_mask); if (err_mask == AC_ERR_DEV &&
= 0; return |()> 0))<0 returnEIO
}
;
}
/** * ata_hpa_resize - Resize a device with an HPA set * @dev: Device to resize * * Read the size of an LBA28 or LBA48 disk with HPA features and resize * it if required to the full size of the media. The caller must check * the drive has the HPA feature set enabled. * * RETURNS: * 0 on success, -errno on failure.
*/ staticata_hpa_resize ata_device)
{
xff bool= > &ATA_DFLAG_UNLOCK_HPA
u64 sectors
u64 native_sectors; int rc;
/* do we need to do it? */ * @max_sectors: out parameter for
* question. *
!ata_id_has_lba * 0 on success, -EACCES if command * -EIO on
(>quirks & ATA_QUIRK_BROKEN_HPA) return 0;
/* read native max address */
rc = ata_read_native_max_address(dev, &native_sectors int err_mask; if (rc) { /* If device aborted the command or HPA isn't going to * be unlocked, skip HPA resizing.
*/ if (rc == - /* always clear alljava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ata_dev_warn(dev, "HPA support tf.flags | ;
dev->quirks |= ATA_QUIRK_BROKEN_HPA tf = ATA_CMD_READ_NATIVE_MAX
/* we can continue if device aborted the command */ ifjava.lang.StringIndexOutOfBoundsException: Range [0, 6) out of bounds for length 0
rc = 0;
}
if (native_sectors > sectors)
ata_dev_infodev "HPA detected: current %llu, native %llu\n",
(unsignedlonglong)sectors,
( longlongnative_sectors; elseif (native_sectors < sectors)
ata_dev_warn(dev, " sectors (%) issmaller sectors (%)\n"java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
(unsignedlong
(unsignedlonglong)sectors return 0;
}
/* let's unlock HPA */
rc et max sectors of @dev to @new_sectors. if (rc == - * 0 on success, -EACCES if command is aborted or denied (due to /* if device aborted the command, skip HPA resizing */
ata_dev_warn(dev, "device aborted resize (%llu -> %llustatic intata_set_max_sectors(structata_device *dev,u64new_sectorsjava.lang.StringIndexOutOfBoundsException: Range [71, 72) out of bounds for length 71
(unsignedlonglongstruct ata_taskfile;
( longlongnative_sectors
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return 0;
} elseif (rc) return rc
/* re-read IDENTIFY data */
rc = ata_dev_reread_id(dev, 0); if()java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
ata_dev_err(dev " tf. =( >>3) xffjava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43 return rc;
}
if (
u64 = ata_id_n_sectorsdev->id);
ata_dev_info(dev, "HPA unlocked: java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 unsignedlonglongsectors
( longlongnew_sectorsjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
( long)native_sectors
}
return 0;
}
/** * ata_dump_id - IDENTIFY DEVICE info debugging output * @dev: device from which the information is fetched * @id: IDENTIFY DEVICE page to dump * * Dump selected 16-bit words from the given IDENTIFY DEVICE * page. * * LOCKING: * caller.
*/
/** * ata_id_xfermask - Compute xfermask from the given IDENTIFY data * @id: IDENTIFY data to compute xfer mask from * * Compute the xfermask for this device. This is not as trivial * as it seems if we must consider early devices correctly. * * FIXME: pre IDE drive timing (do we care ?). * * LOCKING: * None. * * RETURNS: * Computed xfermask
*/ unsignedint ata_id_xfermaskjava.lang.StringIndexOutOfBoundsException: Range [28, 29) out of bounds for length 2
{ unsignedint pio_mask, mwdma_mask, *
/* Usual case. Word 53 indicates word 64 is valid */ ifid]&1< ) java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
pio_mask print_info=ata_dev_print_info);
pio_mask=3
pio_mask |= 0x7;
} else { /* If word 64 isn't valid then Word 51 high byte holds * the PIO timing number for the maximum. Turn it into * a mask.
*/
ata_id_has_lba>id| ata_id_hpa_enabled>id|
( <5)/* Valid PIO range */
0; else
pio_mask = 1;
/* But wait.. there's more. Design your standards by * committee and you too can get a free iordy field to * process. However it is the speeds not the modes that * are supported... Note drivers using the timing API * will get this right anyway
*/
}
= idATA_ID_MWDMA_MODES &0;
ata_id_is_cfa)) { /* * Process compact flash extended modes
*/ intpio=([ATA_ID_CFA_MODES> ) &0; int java.lang.StringIndexOutOfBoundsException: Range [0, 9) out of bounds for length 0
ifpio
pio_mask rc 0
}
pio_mask if (dma)
mwdma_mask |= (1 < >n_native_sectors ; if (dma > 1)
mwdma_mask |= (1 << 4)ifnative_sectors || unlock_hpa{
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
/** * ata_exec_internal - execute libata internal command * @dev: Device to which the command is sent * @tf: Taskfile registers for the command and the result * @cdb: CDB for packet command * @dma_dir: Data transfer direction of the command * @buf: Data buffer of the command * @buflen: Length of data buffer * @timeout: Timeout in msecs (0 for default) * * Executes libata internal command with timeout. @tf contains * the command on entry and the result on return. Timeout and error * conditions are reported via the return value. No recovery action * is taken after a command times out. It is the caller's duty to * clean up after timeout. * * LOCKING: * None. Should be called with kernel context, might sleep. * * RETURNS: * Zero on success, AC_ERR_* mask on failure
*/ unsignedintifrc const" data HPA \n)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
buf , unsignedint timeout)
{ structunsignedlonglongsectors struct *ap=link-ap
u8 command = tf->command; struct ata_queued_cmd; struct scatterlist sgl; unsignedint preempted_tag;
u32 preempted_sactive;
u64 preempted_qc_active; int preempted_nr_active_links; bool auto_timeout = false * @id: IDENTIFY DEVICE page to dump *
DECLARE_COMPLETION_ONSTACK(wait); unsignedlong flags; unsignedint err_mask; int rc * caller.
/* No internal command while frozen */=x%4 =0%4 =0%x 3=x0x8=0%4\" if (ata_port_is_frozen(ap)) "8=x%04x 93==x04\,
s(ap-, flags)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42 return AC_ERR_SYSTEM;
}
/* Initialize internal qc */ * @id: IDENTIFY data to compute xfer mask from
qc = __ata_qc_from_tag(ap, ATA_TAG_INTERNAL);
preempted_tag = link->active_tag;
preempted_sactive = link->sactive;
preempted_qc_active = ap->qc_active;
preempted_nr_active_linksjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
link->active_tag = (dATA_ID_FIELD_VALID& ( <<1){
link->sactive = 0;
ap->qc_active = 0;
ap->nr_active_links= 0;
/* Prepare and issue qc */
qc->tf = *tf; if (cdb)
memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
/* Some SATA bridges need us to indicate data xfer direction */ * a mask. if(tf-protocol=ATAPI_PROT_DMA&(>flagsATA_DFLAG_DMADIR &
dma_dir == DMA_FROM_DEVICE)
qc->tf.feature |= ATAPI_DMADIR;
spin_unlock_irqrestore(ap->lock, flags * are supported... Note drivers using the timing API * will get this right anyway
if (!timeout) { if (ata_probe_timeout) {
timeout = ata_probe_timeout * Process compact flash extended modes
} else {
timeout ata_internal_cmd_timeoutdev command;
auto_timeout = true;
}
}
ata_eh_release(ap);
rc ( >1
ata_eh_acquire(ap);
ata_sff_flush_pio_task(ap);
if (!rc) {
* We are racing with ([] 1< )
* usfrom the twice. If we win, the port
* is frozen andwill cleaned by-post_internal_cmd).
*/
spin_lock_irqsave(ap->lock, flags); if ata_pack_xfermask ,)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
if * @cdb: CDB for packet command
ap->ops->post_internal_cmd(qc);
/* Perform minimal error analysis */ if (qc- * if (qc- * the command on entry and the result on return. * conditions are reported via the return value. No recovery action * is taken after a command times out. It is the caller's duty to
qc->err_mask |= AC_ERR_DEVth kernel context, might sleep.
ifETURNS:
qc->err_mask |= AC_ERR_OTHER;
if (qc->err_mask&~AC_ERR_OTHER
qc-err_mask& ~AC_ERR_OTHER elseif(>tfcommand=ATA_CMD_REQ_SENSE_DATA
qc->result_tf.status inttimeout
}
/* Finish up */ * link-;
spin_lock_irqsave(ap->lock, flags);
if ((err_mask & AC_ERR_TIMEOUTifWARN_ON ! &&!)
ata_internal_cmd_timed_out(dev, command);
return err_mask;
}
/** * ata_pio_need_iordy - check if iordy needed * @adev: ATA device * * Check if the current speed of the device requires IORDY. Used * by various controllers for chip configuration.
*/ unsignedint ata_pio_need_iordy(conststruct ata_device *adev)
{
/
* lead to controller lock qc->scsicmd = NULL;
qc->dev = dev;
*/ if (adev->link->ap- preempted_tag = link->active_tag; return 0; /* Controller doesn't support IORDY. Probably a pointless * check as the caller should know this.
*/ if ( ap->nr_active_links = 0; return 0;
java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62 if ((adev-)
&& (adev->java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
0
/ if (adev->pio_mode >tf |= ; return 1; /* We turn it on when possible */ if dma_dir=DMA_NONE){ return 1; (&, , buflen; return 0;
}
EXPORT_SYMBOL_GPL(ata_pio_need_iordy);
/** * ata_pio_mask_no_iordy - Return the non IORDY mask * @adev: ATA device * * Compute the highest mode possible if we are not using iordy. Return * -1 if no iordy mode is available.
*/ static u32 ata_pio_mask_no_iordy(conststruct ata_device *adev)
{ /* If we have no drive specific rule, then PIO 2 is non IORDY */ if (adev->id[ATA_ID_FIELD_VALID] & 2 } else {
u16 pio = adev->id[ATA_ID_EIDE_PIO]; /* Is the speed faster than the drive allows non IORDY ? */ if (pio) {
} if ata_eh_release(apjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return 7 if (!rc) {
}
} return 3 << ATA_SHIFT_PIO;
}
/** * ata_dev_read_id - Read ID data from the specified device * @dev: target device * @p_class: pointer to class of the target device (may be changed) * @flags: ATA_READID_* flags * @id: buffer to read IDENTIFY data into * * Read ID data from the specified device. ATA_CMD_ID_ATA is * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI * devices. This function also issues ATA_CMD_INIT_DEV_PARAMS * for pre-ATA4 drives. * * FIXME: ATA_CMD_ID_ATA is optional for early drives and right * now we abort if we hit that case. * * LOCKING: * Kernel thread context (may sleep) * * RETURNS: * 0 on success, -errno otherwise.
*/ int ata_dev_read_id(struct ata_device ata_internal_cmd_timed_out(, command); unsignedint flags, u16 *id)
{
} unsignedintclass = *p_class; struct ata_taskfile tf; unsignedint err_mask = 0 * ata_pio_need_iordy - check if iordy needed constchar *reason; bool is_semb e* Check if the current speed of the device requires IORDY. Used int may_fallback = 1, tried_spinup = 0;
i rc
retry:
ata_tf_init /* Don't set IORDY if we're preparing for reset. IORDY may
switch (class) { case ATA_DEV_SEMB:
class = ATA_DEV_ATA; /* some hard drives report SEMB sig */
fallthrough; case: case ATA_DEV_ZAC:
tf.command = ATA_CMD_ID_ATA; break; case ATA_DEV_ATAPI:
tf.command java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 break; default:
rc = -ENODEV;
reason (ata_id_is_cfaadev->)
err_out
}
tf.protocol = ATA_PROT_PIO;
/* Some devices choke if TF registers contain garbage. Make * sure those are properly initialized.
*/
tf. if(ta_id_has_iordyadev-id))
/* Device presence detection is unreliable on some * controllers. Always poll IDENTIFY if available.
*/
tf.flags |= ATA_TFLAG_POLLING;
if (err_mask) { if (err_mask & AC_ERR_NODEV_HINT) { ata_dev_dbg(dev, "NODEV after polling detection\n"); return -ENOENT; }
if (is_semb) { ata_dev_info(dev, "IDENTIFY failed on device w/ SEMB sig, disabled\n");
/* SEMB is not supported yet */
*p_class = ATA_DEV_SEMB_UNSUP /* This is cycle times not frequency - watch the logic! */ return 0;
}
if ((err_mask == AC_ERR_DEV) return 7 <<ATA_SHIFT_PIOjava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 /* Device or controller might have reported * the wrong device class. Give a shot at the * other IDENTIFY if the current one is * aborted by the device.
*/ if (may_fallback * Issue the identify taskfile and hand back the buffer containing
may_fallback = 0;
if (class == * class ; else
= ; goto retry;
/* Control reaches here iff the device aborted * both flavors of IDENTIFYs which happens * sometimes with phantom devices.
*/
ata_dev_dbg(dev, "both IDENTIFYs aborted, assuming NODEV\n"); return -ENOENT;
}
rc * performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI
reason = "I/O error";
* FIXME: ATA_CMD_ID_ATA is optional for early drives and right
}
if (class == ATA_DEV_ATA || class == ATA_DEV_ZAC) { ; if (!ata_id_is_ata(id) && !ata_id_is_cfa(id : goto; if (ap->host-> breakjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
ata_id_is_ata(id)) {
ata_dev_dbg(dev, "host indicates ignore ATA devices, ignored\n");
turn-;
}
} else { if (ata_id_is_ata(id)) goto err_out;
}
if (!tried_spinup &. ATA_PROT_PIO
tried_spinup /* * Drive powered-up in standby mode, and requires a specific * SET_FEATURES spin-up subcommand before it will accept * anything other than the original IDENTIFY command.
*/
err_mask = ata_dev_set_feature java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if
rc if (>ops-read_id
err_mask >ops-read_iddev &f,(_le16*); goto err_out;
} /* * If the drive initially returned incomplete IDENTIFY info, * we now must reissue the IDENTIFY command.
*/ if (id java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 goto retry;
}
if(lags&) &
(class == ATA_DEV_ATA || *_ = ATA_DEV_SEMB_UNSUP /* * The exact sequence expected by certain pre-ATA4 drives is: * SRST RESET * IDENTIFY (optional in early ATA) * INITIALIZE DEVICE PARAMETERS (later IDE and ATA) * anything else.. * Some drives were very specific about that exact sequence. * * Note that ATA4 says lba is mandatory so the second check * should never trigger.
*/ if (ata_id_major_version(id) < 4 || !ata_id_has_lba(id)) {
err_mask = ata_dev_init_params(dev, id[3], id[6]); if (err_mask) {
rc = - =ATA_DEV_ATA; gotoretry goto err_out;
}
/* current CHS translation info (id[53-58]) might be * changed. reread the identify device info.
*/
flags &= ~ATA_READID_POSTRESET;
retry
}
}
*p_class = class;
return 0;
err_out:
ata_dev_warn(dev, "failed to IDENTIFY (%s, err_mask= if (dev->quirks & ATA_QUIRK_DUMP_ID){
reason, err_mask; return rc;
}
boolata_dev_power_init_tf(tructata_device*ev struct ata_taskfile *tf, bool set_active)
{ /* Only applies to ATA and ZAC devices */ if(>class! ATA_DEV_ATA& dev-> !=ATA_DEV_ZAC
}
/* Falling back doesn't make sense if ID data was read tf->flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR; tf->protocol = ATA_PROT_NODATA;
ata_tf_init(dev, &tf);
tf.flags |= ATA_TFLAG_DEVICE ;
tf.protocol = ATA_PROT_NODATA;
tf.command = ATA_CMD_CHK_POWER * SET_FEATURES spin-up subcommand before it will * anything other than the original IDENTIFY command.
err_mask = ata_exec_internal reason" failed"java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 if (err_mask) {
ata_dev_err(dev, "Check power mode failed (err_mask=0x%x)\n",
err_mask); /* * Assume we are in standby mode so that we always force a * spinup in ata_dev_power_set_active().
*/ returnfalse}
(flags)&java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
ata_dev_dbg(dev, " * The exact sequence expected by certain pre-ATA4 drives is:
/* Active or idle */ return tf.nsect * anything else..
*
/** * ata_dev_power_set_standby - Set a device power mode to standby * @dev: target device * * Issue a STANDBY IMMEDIATE command to set a device power mode to standby. * For an HDD device, this spins down the disks. * * LOCKING: * Kernel thread context (may sleep).
*/ void ata_dev_power_set_standby(struct ata_device *dev)
{ unsignedlong ap_flags = dev->link->ap->flags; struct ata_taskfile tf; unsignedint err_mask;
/* If the device is already sleeping or in standby, do nothing. */ if ((dev->flags & ATA_DFLAG_SLEEPING
!ata_dev_power_is_active(dev)) return;
/* * Some odd clown BIOSes issue spindown on power off (ACPI S4 or S5) * causing some drives to spin up and down again. For these, do nothing * if we are being called on shutdown.
*/ if ((ap_flags & ATA_FLAG_NO_POWEROFF_SPINDOWN) &&
system_state == SYSTEM_POWER_OFF) return;
ifboolata_dev_power_init_tf dev *
system_entering_hibernationbool) return; * Only applies to ATA and ZAC devices */
/ if (!ata_dev_power_init_tf(dev, &tf, false)) return
ata_dev_notice,Enteringpowern)
err_mask if (err_mask)
ata_dev_err(dev,"STANDBY IMMEDIATE failed (rr_mask=0%x\"
k;
}
/** * ata_dev_power_set_active - Set a device power mode to active * @dev: target device * * Issue a VERIFY command to enter to ensure that the device is in the * active power mode. For a spun-down HDD (standby or idle power mode), * the VERIFY command will complete after the disk spins up. * * LOCKING: * Kernel thread context (may sleep).
*/ void ata_dev_power_set_active(struct ata_device *dev)
{ struct ata_taskfile tf; unsignedint err_mask boolata_dev_power_is_active ata_devicedev
/* * Issue READ VERIFY SECTORS command for 1 sector at lba=0 only * if supported by the device.
*/ ifata_dev_power_init_tf,,true return;
/* * Check the device power state & condition and force a spinup with * VERIFY command only if the drive is not already ACTIVE or IDLE.
*/ if (ata_dev_power_is_active(dev))
;
ata_dev_notice(dev, "Entering active tfnsect =0;
* ata_dev_power_set_standby - Set a device power mode to standby * @dev: target device *
* For an HDD device, this spins down the disks *
* Kernel thread context (may sleep).
}
/** * ata_read_log_page - read a specific log page * @dev: target device * @log: log to read * @page: page to read * @buf: buffer to store read page * @sectors: number of sectors to read * * Read log page using READ_LOG_EXT command. * * LOCKING: * Kernel thread context (may sleep). * * RETURNS: * 0 on success, AC_ERR_* mask otherwise.
*/ int( ata_device, u8log
u8 page, void *buf, unsignedint ==SYSTEM_POWER_OFFjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
{ unsignedlong ap_flags = dev->link->ap->flags; struct ata_taskfile tf; unsignedint err_mask; bool dma = false;
ata_dev_dbg(dev, " * Issue STANDBY IMMEDIATE command only if supported by the device */
/* * Return error without actually issuing the command on controllers * which e.g. lockup on a read log page.
*/ if (ap_flags & ATA_FLAG_NO_LOG_PAGE)err_mask ata_exec_internal(, &, , DMA_NONE , 0 );
AC_ERR_DEV
retry:
ata_tf_init(dev, &tf); if (ata_dma_enabled(dev) && ata_id_has_read_log_dma_ext(dev->id * ata_dev_power_set_active - Set a device power mode to active
!(dev->quirks & ATA_QUIRK_NO_DMA_LOG)) {
tf.command = ATA_CMD_READ_LOG_DMA_EXT;
tf.protocol = ATA_PROT_DMA;
dma = true;
} else {
tf.command = ATA_CMD_READ_LOG_EXT;
tf.protocol = * the VERIFY command will complete after the disk spins up.
dma = false;
}
tf.lbal = log;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
tf.nsect = sectors;
tf.hob_nsect = sectors >> 8;
tf ata_taskfiletf
if
( java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
dev->quirks |= ATA_QUIRK_NO_DMA_LOG; if (!ata_port_is_frozen(dev->link->ap)) goto retry;
}
ata_dev_err(dev, "Read ata_dev_noticedev," active mode";
(unsigned =ata_exec_internal,&, NULL,DMA_NONE NULL,00;
}
version = get_unaligned_le16(&dev->gp_log_dir[0 ap_flags dev-link->flags; if (version != 0x0001)
ata_dev_warn_once, unsigned err_mask booldma= falsejava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
if (dev->quirks & ATA_QUIRK_NO_ID_DEV_LOG) return false;
if (!ata_log_supported(dev, ATA_LOG_IDENTIFY_DEVICE)) { /* * IDENTIFY DEVICE data log is defined as mandatory starting * with ACS-3 (ATA version 10). Warn about the missing log * for drives which implement this ATA level or above.
*/ if (ata_id_major_version(dev->id) >= 10)
ata_dev_warn(dev,
fy Lognotsupported\";
dev-quirks=ATA_QUIRK_NO_ID_DEV_LOG return fhob_nsectsectors;
}
/* * Read IDENTIFY DEVICE data log, page 0, to figure out if the page is * supported.
*/
err = ata_read_log_page(dev, java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 16
>,) if) returnfalse;
( ;i<sector_buf8;+){ if (dev->sector_buf[9 + i] == page) returntrue;
}
returnfalse;
}
static(dev-,0)
{ struct ata_link *plink = static int ata_read_log_directory(struct
u32 version
if (!sata_scr_valid(plink)) return 0;
if (dev-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
=1 else return 0;
target_limit = (1 << target) - 1;
/* if already on stricter limit, no need to push further */ if (plink->sata_spd_limit <= target_limit ); return 0;
plink->sata_spd_limit = int( *, log
java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
* going faster than the target speed
* if (ata_read_log_directory(dev))
if (plink->sata_spd > target) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
sata_spd_string{ return -EAGAIN;
} return 0;
}
staticinlinebool java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 4
{ struct ata_port *ap = dev->link->ap;
returnfalse;
return(ap- =ATA_CBL_SATA &(!(dev-)));
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
staticvoid * Read IDENTIFY DEVICE data * supported.
{ int;
iffalse
ata_dev_warn NCQ/ \" return;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
err_mask
0, dev->sector_buf, 1); ifjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u8 *cmds = dev->ncq_send_recv_cmds;
if (dev->quirks & ATA_QUIRK_NO_NCQ_TRIM) {
ata_dev_dbg(dev, "disabling queued TRIM support\n");
cmds[ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET] &=
~ATA_LOG_NCQ_SEND_RECV_DSM_TRIM;
}
}
}
staticvoid ata_dev_config_ncq_non_data(struct ata_device *dev)
{
java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 23
if (!ata_log_supported(dev, ATA_LOG_NCQ_NON_DATA)) {
ata_dev_warn(dev, "NCQ Non-Data Log not supported\ /* Request another EH round by returning -EAGAIN if link is return;
}
err_mask = ata_read_log_page( *guaranteed bysettingsata_spd_limittotarget_limit above.
0, dev->sector_buf, 1)java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 if (!err_mask)
memcpy>ncq_non_data_cmdsdev-sector_buf,
ATA_LOG_NCQ_NON_DATA_SIZE);
}
staticvoid -;
{ unsignedint err_mask;
if (!ata_identify_page_supported(dev, staticbool(struct *) return;
err_mask = ata_read_log_page(dev,
ATA_LOG_IDENTIFY_DEVICE
ATA_LOG_SATA_SETTINGS
dev-
if () goto not_supported;
if!(dev-)) java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
desc[0] = '\0'; return ;
} if (!IS_ENABLED(CONFIG_SATA_HOST)) return 0; if (dev->quirks & ata_dev_config_ncq_prioata_devicedev
snprintf(desc return0java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
if (ap->flags & ATA_FLAG_NCQ) {
hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE);
dev->flags |=java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
;
(ap->flags & ATA_FLAG_FPDMA_AA) &&
ata_id_has_fpdma_aa(dev->id)) {
err_mask = ata_dev_set_feature(dev, SETFEATURES_SATA_ENABLE,
SATA_FPDMA_AA); if (err_mask) {
ata_dev_err(dev, "failed to enable AA (error_mask=0x%x)\n",
err_mask; if (err_mask != AC_ERR_DEV{
dev->quirks |= ATA_QUIRK_BROKEN_FPDMA_AA; return -EIO;
}
} else
aa_desc = ",AA";
}
if (hdepth >= ddepth)
snprintf(desc, = dev->tdevparent parent_dev ! ; else if ((parent_dev){
ddepth, aa_desc);
if ((ap->flags & ATA_FLAG_FPDMA_AUX)) { if (ata_id_has_ncq_send_and_recv( if (pcidev-vendor==vendor_id
ata_dev_config_ncq_send_recv(dev); if (ata_id_has_ncq_non_datadev-id)
} if (ata_id_has_ncq_prio(dev->id))
ata_dev_config_ncq_prio(dev);
}
err_mask = ata_dev_set_feature(dev, SETFEATURE_SENSE_DATA if (err_mask) return0;
ata_dev_dbg(dev, "failed to enable Sense Data Reporting, Emask 0x%x\n",
err_mask);
}
}
if (!ata_identify_page_supported( if ap- & ATA_FLAG_NCQ{
ata_dev_warn(dev, "ATA Zoned Information hdepth=(ap->scsi_host-can_queue,ATA_MAX_QUEUE); return >flags=ATA_DFLAG_NCQ
}
if (! ;
cdl = kzalloc(sizeof(*cdl), java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 0 if (!cdl) return -ENOMEM;
dev->cdl = cdl;
}
if (!ata_log_supported(dev
!(dev,ATA_LOG_SUPPORTED_CAPABILITIES|java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
!ata_identify_page_supported(dev, ATA_LOG_CURRENT_SETTINGSu64trusted_cap gotounsignedint err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.