Commit f7a1d00e authored by Linus Torvalds's avatar Linus Torvalds

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'
parents 8f7ac50c 481f7017
...@@ -107,13 +107,14 @@ Description: ...@@ -107,13 +107,14 @@ Description:
described in ATA8 7.16 and 7.17. Only valid if described in ATA8 7.16 and 7.17. Only valid if
the device is not a PM. the device is not a PM.
pio_mode: (RO) Transfer modes supported by the device when pio_mode: (RO) PIO transfer mode used by the device.
in PIO mode. Mostly used by PATA 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 dma_mode: (RO) DMA transfer mode used by the device.
in DMA mode. Mostly used by PATA device. Mostly used by PATA devices.
class: (RO) Device class. Can be "ata" for disk, class: (RO) Device class. Can be "ata" for disk,
"atapi" for packet device, "pmp" for PM, or "atapi" for packet device, "pmp" for PM, or
......
...@@ -11264,6 +11264,7 @@ M: Damien Le Moal <damien.lemoal@opensource.wdc.com> ...@@ -11264,6 +11264,7 @@ M: Damien Le Moal <damien.lemoal@opensource.wdc.com>
L: linux-ide@vger.kernel.org L: linux-ide@vger.kernel.org
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dlemoal/libata.git 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: Documentation/devicetree/bindings/ata/
F: drivers/ata/ F: drivers/ata/
F: include/linux/ata.h F: include/linux/ata.h
......
...@@ -2010,16 +2010,16 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log, ...@@ -2010,16 +2010,16 @@ unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
return err_mask; 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; struct ata_port *ap = dev->link->ap;
if (dev->horkage & ATA_HORKAGE_NO_LOG_DIR) 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)) if (ata_read_log_page(dev, ATA_LOG_DIRECTORY, 0, ap->sector_buf, 1))
return false; return 0;
return get_unaligned_le16(&ap->sector_buf[log * 2]) ? true : false; return get_unaligned_le16(&ap->sector_buf[log * 2]);
} }
static bool ata_identify_page_supported(struct ata_device *dev, u8 page) 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) ...@@ -2455,15 +2455,20 @@ static void ata_dev_config_cpr(struct ata_device *dev)
struct ata_cpr_log *cpr_log = NULL; struct ata_cpr_log *cpr_log = NULL;
u8 *desc, *buf = NULL; u8 *desc, *buf = NULL;
if (ata_id_major_version(dev->id) < 11 || if (ata_id_major_version(dev->id) < 11)
!ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES)) goto out;
buf_len = ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES);
if (buf_len == 0)
goto out; goto out;
/* /*
* Read the concurrent positioning ranges log (0x47). We can have at * 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); buf = kzalloc(buf_len, GFP_KERNEL);
if (!buf) if (!buf)
goto out; goto out;
...@@ -5462,7 +5467,7 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev, ...@@ -5462,7 +5467,7 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
const struct ata_port_info * const * ppi, const struct ata_port_info * const * ppi,
int n_ports) int n_ports)
{ {
const struct ata_port_info *pi; const struct ata_port_info *pi = &ata_dummy_port_info;
struct ata_host *host; struct ata_host *host;
int i, j; int i, j;
...@@ -5470,7 +5475,7 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev, ...@@ -5470,7 +5475,7 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
if (!host) if (!host)
return NULL; 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]; struct ata_port *ap = host->ports[i];
if (ppi[j]) if (ppi[j])
......
...@@ -2125,7 +2125,7 @@ static unsigned int ata_scsiop_inq_b9(struct ata_scsi_args *args, u8 *rbuf) ...@@ -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 */ /* SCSI Concurrent Positioning Ranges VPD page: SBC-5 rev 1 or later */
rbuf[1] = 0xb9; 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) { for (i = 0; i < cpr_log->nr_cpr; i++, desc += 32) {
desc[0] = cpr_log->cpr[i].num; desc[0] = cpr_log->cpr[i].num;
......
...@@ -196,7 +196,7 @@ static struct { ...@@ -196,7 +196,7 @@ static struct {
{ XFER_PIO_0, "XFER_PIO_0" }, { XFER_PIO_0, "XFER_PIO_0" },
{ XFER_PIO_SLOW, "XFER_PIO_SLOW" } { 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 * ATA Port attributes
......
...@@ -856,12 +856,14 @@ static int octeon_cf_probe(struct platform_device *pdev) ...@@ -856,12 +856,14 @@ static int octeon_cf_probe(struct platform_device *pdev)
int i; int i;
res_dma = platform_get_resource(dma_dev, IORESOURCE_MEM, 0); res_dma = platform_get_resource(dma_dev, IORESOURCE_MEM, 0);
if (!res_dma) { if (!res_dma) {
put_device(&dma_dev->dev);
of_node_put(dma_node); of_node_put(dma_node);
return -EINVAL; return -EINVAL;
} }
cf_port->dma_base = (u64)devm_ioremap(&pdev->dev, res_dma->start, cf_port->dma_base = (u64)devm_ioremap(&pdev->dev, res_dma->start,
resource_size(res_dma)); resource_size(res_dma));
if (!cf_port->dma_base) { if (!cf_port->dma_base) {
put_device(&dma_dev->dev);
of_node_put(dma_node); of_node_put(dma_node);
return -EINVAL; return -EINVAL;
} }
...@@ -871,6 +873,7 @@ static int octeon_cf_probe(struct platform_device *pdev) ...@@ -871,6 +873,7 @@ static int octeon_cf_probe(struct platform_device *pdev)
irq = i; irq = i;
irq_handler = octeon_cf_interrupt; irq_handler = octeon_cf_interrupt;
} }
put_device(&dma_dev->dev);
} }
of_node_put(dma_node); of_node_put(dma_node);
} }
......
...@@ -822,7 +822,6 @@ struct ata_port { ...@@ -822,7 +822,6 @@ struct ata_port {
struct ata_queued_cmd qcmd[ATA_MAX_QUEUE + 1]; struct ata_queued_cmd qcmd[ATA_MAX_QUEUE + 1];
u64 qc_active; u64 qc_active;
int nr_active_links; /* #links with active qcs */ 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 link; /* host default link */
struct ata_link *slave_link; /* see ata_slave_link_init() */ struct ata_link *slave_link; /* see ata_slave_link_init() */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment