forked from Minki/linux
ATA fixes for 5.19-rc2
Several small fixes for rc2: * Remove unused field in struct ata_port, from Hannes. * Fix a potential (very unlikely) NULL pointer dereference in ata_host_alloc_pinfo(), from Sergey. * Fix a device reference leak in the pata_octeon_cf driver, from Miaoqian. * Fixes for handling access to the concurrent positioning ranges log page used with multi-actuator HDDs, from Tyler. * Fix the values shown by the pio_mode and dma_mode sysfs device attributes, from Sergey. * Update the MAINTAINERS file to add libata sysfs ABI documentation file, from Sergey. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSRPv8tYSvhwAzJdzjdoc3SxdoYdgUCYqMjsAAKCRDdoc3SxdoY dvS8AQDKFhvTnzQL/nIHWC5y0bsH4wF213g69SM79U7sPL2boQEAxczNR4RllIcT yv4aAG1mk2+ii6ClqdC4m1EfpS1WtgI= =fsTk -----END PGP SIGNATURE----- Merge tag 'ata-5.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata Pull ATA fixes from Damien Le Moal: "Several small fixes for rc2: - Remove unused field in struct ata_port (Hannes) - Fix a potential (very unlikely) NULL pointer dereference in ata_host_alloc_pinfo() (Sergey) - Fix a device reference leak in the pata_octeon_cf driver (Miaoqian) - Fixes for handling access to the concurrent positioning ranges log page used with multi-actuator HDDs (Tyler) - Fix the values shown by the pio_mode and dma_mode sysfs device attributes (Sergey) - Update the MAINTAINERS file to add libata sysfs ABI documentation file (Sergey)" * tag 'ata-5.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata: MAINTAINERS: add ATA sysfs file documentation to libata entry ata: libata-transport: fix {dma|pio|xfer}_mode sysfs files libata: fix translation of concurrent positioning ranges libata: fix reading concurrent positioning ranges log ata: pata_octeon_cf: Fix refcount leak in octeon_cf_probe ata: libata-core: fix NULL pointer deref in ata_host_alloc_pinfo() ata: libata: drop 'sas_last_tag'
This commit is contained in:
commit
f7a1d00e74
@ -107,13 +107,14 @@ Description:
|
||||
described in ATA8 7.16 and 7.17. Only valid if
|
||||
the device is not a PM.
|
||||
|
||||
pio_mode: (RO) Transfer modes supported by the device when
|
||||
in PIO mode. Mostly used by PATA device.
|
||||
pio_mode: (RO) PIO transfer mode used by the device.
|
||||
Mostly used by PATA devices.
|
||||
|
||||
xfer_mode: (RO) Current transfer mode
|
||||
xfer_mode: (RO) Current transfer mode. Mostly used by
|
||||
PATA devices.
|
||||
|
||||
dma_mode: (RO) Transfer modes supported by the device when
|
||||
in DMA mode. Mostly used by PATA device.
|
||||
dma_mode: (RO) DMA transfer mode used by the device.
|
||||
Mostly used by PATA devices.
|
||||
|
||||
class: (RO) Device class. Can be "ata" for disk,
|
||||
"atapi" for packet device, "pmp" for PM, or
|
||||
|
@ -11264,6 +11264,7 @@ M: Damien Le Moal <damien.lemoal@opensource.wdc.com>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git
|
||||
F: Documentation/ABI/testing/sysfs-ata
|
||||
F: Documentation/devicetree/bindings/ata/
|
||||
F: drivers/ata/
|
||||
F: include/linux/ata.h
|
||||
|
@ -2010,16 +2010,16 @@ retry:
|
||||
return err_mask;
|
||||
}
|
||||
|
||||
static bool ata_log_supported(struct ata_device *dev, u8 log)
|
||||
static int ata_log_supported(struct ata_device *dev, u8 log)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
|
||||
if (dev->horkage & ATA_HORKAGE_NO_LOG_DIR)
|
||||
return false;
|
||||
return 0;
|
||||
|
||||
if (ata_read_log_page(dev, ATA_LOG_DIRECTORY, 0, ap->sector_buf, 1))
|
||||
return false;
|
||||
return get_unaligned_le16(&ap->sector_buf[log * 2]) ? true : false;
|
||||
return 0;
|
||||
return get_unaligned_le16(&ap->sector_buf[log * 2]);
|
||||
}
|
||||
|
||||
static bool ata_identify_page_supported(struct ata_device *dev, u8 page)
|
||||
@ -2455,15 +2455,20 @@ static void ata_dev_config_cpr(struct ata_device *dev)
|
||||
struct ata_cpr_log *cpr_log = NULL;
|
||||
u8 *desc, *buf = NULL;
|
||||
|
||||
if (ata_id_major_version(dev->id) < 11 ||
|
||||
!ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES))
|
||||
if (ata_id_major_version(dev->id) < 11)
|
||||
goto out;
|
||||
|
||||
buf_len = ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES);
|
||||
if (buf_len == 0)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Read the concurrent positioning ranges log (0x47). We can have at
|
||||
* most 255 32B range descriptors plus a 64B header.
|
||||
* most 255 32B range descriptors plus a 64B header. This log varies in
|
||||
* size, so use the size reported in the GPL directory. Reading beyond
|
||||
* the supported length will result in an error.
|
||||
*/
|
||||
buf_len = (64 + 255 * 32 + 511) & ~511;
|
||||
buf_len <<= 9;
|
||||
buf = kzalloc(buf_len, GFP_KERNEL);
|
||||
if (!buf)
|
||||
goto out;
|
||||
@ -5462,7 +5467,7 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
|
||||
const struct ata_port_info * const * ppi,
|
||||
int n_ports)
|
||||
{
|
||||
const struct ata_port_info *pi;
|
||||
const struct ata_port_info *pi = &ata_dummy_port_info;
|
||||
struct ata_host *host;
|
||||
int i, j;
|
||||
|
||||
@ -5470,7 +5475,7 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
|
||||
if (!host)
|
||||
return NULL;
|
||||
|
||||
for (i = 0, j = 0, pi = NULL; i < host->n_ports; i++) {
|
||||
for (i = 0, j = 0; i < host->n_ports; i++) {
|
||||
struct ata_port *ap = host->ports[i];
|
||||
|
||||
if (ppi[j])
|
||||
|
@ -2125,7 +2125,7 @@ static unsigned int ata_scsiop_inq_b9(struct ata_scsi_args *args, u8 *rbuf)
|
||||
|
||||
/* SCSI Concurrent Positioning Ranges VPD page: SBC-5 rev 1 or later */
|
||||
rbuf[1] = 0xb9;
|
||||
put_unaligned_be16(64 + (int)cpr_log->nr_cpr * 32 - 4, &rbuf[3]);
|
||||
put_unaligned_be16(64 + (int)cpr_log->nr_cpr * 32 - 4, &rbuf[2]);
|
||||
|
||||
for (i = 0; i < cpr_log->nr_cpr; i++, desc += 32) {
|
||||
desc[0] = cpr_log->cpr[i].num;
|
||||
|
@ -196,7 +196,7 @@ static struct {
|
||||
{ XFER_PIO_0, "XFER_PIO_0" },
|
||||
{ XFER_PIO_SLOW, "XFER_PIO_SLOW" }
|
||||
};
|
||||
ata_bitfield_name_match(xfer,ata_xfer_names)
|
||||
ata_bitfield_name_search(xfer, ata_xfer_names)
|
||||
|
||||
/*
|
||||
* ATA Port attributes
|
||||
|
@ -856,12 +856,14 @@ static int octeon_cf_probe(struct platform_device *pdev)
|
||||
int i;
|
||||
res_dma = platform_get_resource(dma_dev, IORESOURCE_MEM, 0);
|
||||
if (!res_dma) {
|
||||
put_device(&dma_dev->dev);
|
||||
of_node_put(dma_node);
|
||||
return -EINVAL;
|
||||
}
|
||||
cf_port->dma_base = (u64)devm_ioremap(&pdev->dev, res_dma->start,
|
||||
resource_size(res_dma));
|
||||
if (!cf_port->dma_base) {
|
||||
put_device(&dma_dev->dev);
|
||||
of_node_put(dma_node);
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -871,6 +873,7 @@ static int octeon_cf_probe(struct platform_device *pdev)
|
||||
irq = i;
|
||||
irq_handler = octeon_cf_interrupt;
|
||||
}
|
||||
put_device(&dma_dev->dev);
|
||||
}
|
||||
of_node_put(dma_node);
|
||||
}
|
||||
|
@ -822,7 +822,6 @@ struct ata_port {
|
||||
struct ata_queued_cmd qcmd[ATA_MAX_QUEUE + 1];
|
||||
u64 qc_active;
|
||||
int nr_active_links; /* #links with active qcs */
|
||||
unsigned int sas_last_tag; /* track next tag hw expects */
|
||||
|
||||
struct ata_link link; /* host default link */
|
||||
struct ata_link *slave_link; /* see ata_slave_link_init() */
|
||||
|
Loading…
Reference in New Issue
Block a user