Merge branch 'for-3.16-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata into for-3.17
The scheduled ahci platform patches depend on change in for-3.16-fixes. Pull it into for-3.17. Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
commit
e8f781836d
12 changed files with 122 additions and 29 deletions
10
MAINTAINERS
10
MAINTAINERS
|
@ -7993,6 +7993,16 @@ F: drivers/ata/
|
||||||
F: include/linux/ata.h
|
F: include/linux/ata.h
|
||||||
F: include/linux/libata.h
|
F: include/linux/libata.h
|
||||||
|
|
||||||
|
SERIAL ATA AHCI PLATFORM devices support
|
||||||
|
M: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
M: Tejun Heo <tj@kernel.org>
|
||||||
|
L: linux-ide@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||||
|
S: Supported
|
||||||
|
F: drivers/ata/ahci_platform.c
|
||||||
|
F: drivers/ata/libahci_platform.c
|
||||||
|
F: include/linux/ahci_platform.h
|
||||||
|
|
||||||
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
|
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
|
||||||
M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
|
M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
|
|
|
@ -456,6 +456,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||||
|
|
||||||
/* Promise */
|
/* Promise */
|
||||||
{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
|
{ PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
|
||||||
|
{ PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */
|
||||||
|
|
||||||
/* Asmedia */
|
/* Asmedia */
|
||||||
{ PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */
|
{ PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */
|
||||||
|
|
|
@ -371,7 +371,9 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class,
|
||||||
int pmp, unsigned long deadline,
|
int pmp, unsigned long deadline,
|
||||||
int (*check_ready)(struct ata_link *link));
|
int (*check_ready)(struct ata_link *link));
|
||||||
|
|
||||||
|
unsigned int ahci_qc_issue(struct ata_queued_cmd *qc);
|
||||||
int ahci_stop_engine(struct ata_port *ap);
|
int ahci_stop_engine(struct ata_port *ap);
|
||||||
|
void ahci_start_fis_rx(struct ata_port *ap);
|
||||||
void ahci_start_engine(struct ata_port *ap);
|
void ahci_start_engine(struct ata_port *ap);
|
||||||
int ahci_check_ready(struct ata_link *link);
|
int ahci_check_ready(struct ata_link *link);
|
||||||
int ahci_kick_engine(struct ata_port *ap);
|
int ahci_kick_engine(struct ata_port *ap);
|
||||||
|
|
|
@ -58,6 +58,8 @@ enum ahci_imx_type {
|
||||||
struct imx_ahci_priv {
|
struct imx_ahci_priv {
|
||||||
struct platform_device *ahci_pdev;
|
struct platform_device *ahci_pdev;
|
||||||
enum ahci_imx_type type;
|
enum ahci_imx_type type;
|
||||||
|
struct clk *sata_clk;
|
||||||
|
struct clk *sata_ref_clk;
|
||||||
struct clk *ahb_clk;
|
struct clk *ahb_clk;
|
||||||
struct regmap *gpr;
|
struct regmap *gpr;
|
||||||
bool no_device;
|
bool no_device;
|
||||||
|
@ -225,7 +227,7 @@ static int imx_sata_enable(struct ahci_host_priv *hpriv)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ahci_platform_enable_clks(hpriv);
|
ret = clk_prepare_enable(imxpriv->sata_ref_clk);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto disable_regulator;
|
goto disable_regulator;
|
||||||
|
|
||||||
|
@ -287,7 +289,7 @@ static void imx_sata_disable(struct ahci_host_priv *hpriv)
|
||||||
!IMX6Q_GPR13_SATA_MPLL_CLK_EN);
|
!IMX6Q_GPR13_SATA_MPLL_CLK_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
ahci_platform_disable_clks(hpriv);
|
clk_disable_unprepare(imxpriv->sata_ref_clk);
|
||||||
|
|
||||||
if (hpriv->target_pwr)
|
if (hpriv->target_pwr)
|
||||||
regulator_disable(hpriv->target_pwr);
|
regulator_disable(hpriv->target_pwr);
|
||||||
|
@ -320,6 +322,9 @@ static void ahci_imx_error_handler(struct ata_port *ap)
|
||||||
writel(reg_val | IMX_P0PHYCR_TEST_PDDQ, mmio + IMX_P0PHYCR);
|
writel(reg_val | IMX_P0PHYCR_TEST_PDDQ, mmio + IMX_P0PHYCR);
|
||||||
imx_sata_disable(hpriv);
|
imx_sata_disable(hpriv);
|
||||||
imxpriv->no_device = true;
|
imxpriv->no_device = true;
|
||||||
|
|
||||||
|
dev_info(ap->dev, "no device found, disabling link.\n");
|
||||||
|
dev_info(ap->dev, "pass " MODULE_PARAM_PREFIX ".hotplug=1 to enable hotplug\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ahci_imx_softreset(struct ata_link *link, unsigned int *class,
|
static int ahci_imx_softreset(struct ata_link *link, unsigned int *class,
|
||||||
|
@ -540,6 +545,19 @@ static int imx_ahci_probe(struct platform_device *pdev)
|
||||||
imxpriv->no_device = false;
|
imxpriv->no_device = false;
|
||||||
imxpriv->first_time = true;
|
imxpriv->first_time = true;
|
||||||
imxpriv->type = (enum ahci_imx_type)of_id->data;
|
imxpriv->type = (enum ahci_imx_type)of_id->data;
|
||||||
|
|
||||||
|
imxpriv->sata_clk = devm_clk_get(dev, "sata");
|
||||||
|
if (IS_ERR(imxpriv->sata_clk)) {
|
||||||
|
dev_err(dev, "can't get sata clock.\n");
|
||||||
|
return PTR_ERR(imxpriv->sata_clk);
|
||||||
|
}
|
||||||
|
|
||||||
|
imxpriv->sata_ref_clk = devm_clk_get(dev, "sata_ref");
|
||||||
|
if (IS_ERR(imxpriv->sata_ref_clk)) {
|
||||||
|
dev_err(dev, "can't get sata_ref clock.\n");
|
||||||
|
return PTR_ERR(imxpriv->sata_ref_clk);
|
||||||
|
}
|
||||||
|
|
||||||
imxpriv->ahb_clk = devm_clk_get(dev, "ahb");
|
imxpriv->ahb_clk = devm_clk_get(dev, "ahb");
|
||||||
if (IS_ERR(imxpriv->ahb_clk)) {
|
if (IS_ERR(imxpriv->ahb_clk)) {
|
||||||
dev_err(dev, "can't get ahb clock.\n");
|
dev_err(dev, "can't get ahb clock.\n");
|
||||||
|
@ -573,10 +591,14 @@ static int imx_ahci_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
hpriv->plat_data = imxpriv;
|
hpriv->plat_data = imxpriv;
|
||||||
|
|
||||||
ret = imx_sata_enable(hpriv);
|
ret = clk_prepare_enable(imxpriv->sata_clk);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
ret = imx_sata_enable(hpriv);
|
||||||
|
if (ret)
|
||||||
|
goto disable_clk;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure the HWINIT bits of the HOST_CAP and HOST_PORTS_IMPL,
|
* Configure the HWINIT bits of the HOST_CAP and HOST_PORTS_IMPL,
|
||||||
* and IP vendor specific register IMX_TIMER1MS.
|
* and IP vendor specific register IMX_TIMER1MS.
|
||||||
|
@ -601,16 +623,24 @@ static int imx_ahci_probe(struct platform_device *pdev)
|
||||||
ret = ahci_platform_init_host(pdev, hpriv, &ahci_imx_port_info,
|
ret = ahci_platform_init_host(pdev, hpriv, &ahci_imx_port_info,
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
imx_sata_disable(hpriv);
|
goto disable_sata;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
disable_sata:
|
||||||
|
imx_sata_disable(hpriv);
|
||||||
|
disable_clk:
|
||||||
|
clk_disable_unprepare(imxpriv->sata_clk);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_imx_host_stop(struct ata_host *host)
|
static void ahci_imx_host_stop(struct ata_host *host)
|
||||||
{
|
{
|
||||||
struct ahci_host_priv *hpriv = host->private_data;
|
struct ahci_host_priv *hpriv = host->private_data;
|
||||||
|
struct imx_ahci_priv *imxpriv = hpriv->plat_data;
|
||||||
|
|
||||||
imx_sata_disable(hpriv);
|
imx_sata_disable(hpriv);
|
||||||
|
clk_disable_unprepare(imxpriv->sata_clk);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
|
|
@ -58,7 +58,7 @@ static int ahci_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
|
if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
|
||||||
hflags |= AHCI_HFLAG_NO_FBS;
|
hflags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ;
|
||||||
|
|
||||||
rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info,
|
rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info,
|
||||||
hflags, 0, 0);
|
hflags, 0, 0);
|
||||||
|
|
|
@ -81,6 +81,7 @@
|
||||||
struct xgene_ahci_context {
|
struct xgene_ahci_context {
|
||||||
struct ahci_host_priv *hpriv;
|
struct ahci_host_priv *hpriv;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
u8 last_cmd[MAX_AHCI_CHN_PERCTR]; /* tracking the last command issued*/
|
||||||
void __iomem *csr_core; /* Core CSR address of IP */
|
void __iomem *csr_core; /* Core CSR address of IP */
|
||||||
void __iomem *csr_diag; /* Diag CSR address of IP */
|
void __iomem *csr_diag; /* Diag CSR address of IP */
|
||||||
void __iomem *csr_axi; /* AXI CSR address of IP */
|
void __iomem *csr_axi; /* AXI CSR address of IP */
|
||||||
|
@ -100,6 +101,50 @@ static int xgene_ahci_init_memram(struct xgene_ahci_context *ctx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xgene_ahci_restart_engine - Restart the dma engine.
|
||||||
|
* @ap : ATA port of interest
|
||||||
|
*
|
||||||
|
* Restarts the dma engine inside the controller.
|
||||||
|
*/
|
||||||
|
static int xgene_ahci_restart_engine(struct ata_port *ap)
|
||||||
|
{
|
||||||
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||||
|
|
||||||
|
ahci_stop_engine(ap);
|
||||||
|
ahci_start_fis_rx(ap);
|
||||||
|
hpriv->start_engine(ap);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xgene_ahci_qc_issue - Issue commands to the device
|
||||||
|
* @qc: Command to issue
|
||||||
|
*
|
||||||
|
* Due to Hardware errata for IDENTIFY DEVICE command, the controller cannot
|
||||||
|
* clear the BSY bit after receiving the PIO setup FIS. This results in the dma
|
||||||
|
* state machine goes into the CMFatalErrorUpdate state and locks up. By
|
||||||
|
* restarting the dma engine, it removes the controller out of lock up state.
|
||||||
|
*/
|
||||||
|
static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
{
|
||||||
|
struct ata_port *ap = qc->ap;
|
||||||
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||||
|
struct xgene_ahci_context *ctx = hpriv->plat_data;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (unlikely(ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA))
|
||||||
|
xgene_ahci_restart_engine(ap);
|
||||||
|
|
||||||
|
rc = ahci_qc_issue(qc);
|
||||||
|
|
||||||
|
/* Save the last command issued */
|
||||||
|
ctx->last_cmd[ap->port_no] = qc->tf.command;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xgene_ahci_read_id - Read ID data from the specified device
|
* xgene_ahci_read_id - Read ID data from the specified device
|
||||||
* @dev: device
|
* @dev: device
|
||||||
|
@ -107,14 +152,12 @@ static int xgene_ahci_init_memram(struct xgene_ahci_context *ctx)
|
||||||
* @id: data buffer
|
* @id: data buffer
|
||||||
*
|
*
|
||||||
* This custom read ID function is required due to the fact that the HW
|
* This custom read ID function is required due to the fact that the HW
|
||||||
* does not support DEVSLP and the controller state machine may get stuck
|
* does not support DEVSLP.
|
||||||
* after processing the ID query command.
|
|
||||||
*/
|
*/
|
||||||
static unsigned int xgene_ahci_read_id(struct ata_device *dev,
|
static unsigned int xgene_ahci_read_id(struct ata_device *dev,
|
||||||
struct ata_taskfile *tf, u16 *id)
|
struct ata_taskfile *tf, u16 *id)
|
||||||
{
|
{
|
||||||
u32 err_mask;
|
u32 err_mask;
|
||||||
void __iomem *port_mmio = ahci_port_base(dev->link->ap);
|
|
||||||
|
|
||||||
err_mask = ata_do_dev_read_id(dev, tf, id);
|
err_mask = ata_do_dev_read_id(dev, tf, id);
|
||||||
if (err_mask)
|
if (err_mask)
|
||||||
|
@ -136,16 +179,6 @@ static unsigned int xgene_ahci_read_id(struct ata_device *dev,
|
||||||
*/
|
*/
|
||||||
id[ATA_ID_FEATURE_SUPP] &= ~(1 << 8);
|
id[ATA_ID_FEATURE_SUPP] &= ~(1 << 8);
|
||||||
|
|
||||||
/*
|
|
||||||
* Due to HW errata, restart the port if no other command active.
|
|
||||||
* Otherwise the controller may get stuck.
|
|
||||||
*/
|
|
||||||
if (!readl(port_mmio + PORT_CMD_ISSUE)) {
|
|
||||||
writel(PORT_CMD_FIS_RX, port_mmio + PORT_CMD);
|
|
||||||
readl(port_mmio + PORT_CMD); /* Force a barrier */
|
|
||||||
writel(PORT_CMD_FIS_RX | PORT_CMD_START, port_mmio + PORT_CMD);
|
|
||||||
readl(port_mmio + PORT_CMD); /* Force a barrier */
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,6 +340,7 @@ static struct ata_port_operations xgene_ahci_ops = {
|
||||||
.host_stop = xgene_ahci_host_stop,
|
.host_stop = xgene_ahci_host_stop,
|
||||||
.hardreset = xgene_ahci_hardreset,
|
.hardreset = xgene_ahci_hardreset,
|
||||||
.read_id = xgene_ahci_read_id,
|
.read_id = xgene_ahci_read_id,
|
||||||
|
.qc_issue = xgene_ahci_qc_issue,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ata_port_info xgene_ahci_port_info = {
|
static const struct ata_port_info xgene_ahci_port_info = {
|
||||||
|
|
|
@ -68,7 +68,6 @@ static ssize_t ahci_transmit_led_message(struct ata_port *ap, u32 state,
|
||||||
|
|
||||||
static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
static int ahci_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
|
||||||
static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
static int ahci_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
|
||||||
static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc);
|
|
||||||
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc);
|
||||||
static int ahci_port_start(struct ata_port *ap);
|
static int ahci_port_start(struct ata_port *ap);
|
||||||
static void ahci_port_stop(struct ata_port *ap);
|
static void ahci_port_stop(struct ata_port *ap);
|
||||||
|
@ -620,7 +619,7 @@ int ahci_stop_engine(struct ata_port *ap)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ahci_stop_engine);
|
EXPORT_SYMBOL_GPL(ahci_stop_engine);
|
||||||
|
|
||||||
static void ahci_start_fis_rx(struct ata_port *ap)
|
void ahci_start_fis_rx(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
void __iomem *port_mmio = ahci_port_base(ap);
|
void __iomem *port_mmio = ahci_port_base(ap);
|
||||||
struct ahci_host_priv *hpriv = ap->host->private_data;
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||||
|
@ -646,6 +645,7 @@ static void ahci_start_fis_rx(struct ata_port *ap)
|
||||||
/* flush */
|
/* flush */
|
||||||
readl(port_mmio + PORT_CMD);
|
readl(port_mmio + PORT_CMD);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ahci_start_fis_rx);
|
||||||
|
|
||||||
static int ahci_stop_fis_rx(struct ata_port *ap)
|
static int ahci_stop_fis_rx(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
|
@ -1945,7 +1945,7 @@ irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ahci_interrupt);
|
EXPORT_SYMBOL_GPL(ahci_interrupt);
|
||||||
|
|
||||||
static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
|
unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
struct ata_port *ap = qc->ap;
|
struct ata_port *ap = qc->ap;
|
||||||
void __iomem *port_mmio = ahci_port_base(ap);
|
void __iomem *port_mmio = ahci_port_base(ap);
|
||||||
|
@ -1974,6 +1974,7 @@ static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ahci_qc_issue);
|
||||||
|
|
||||||
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
static bool ahci_qc_fill_rtf(struct ata_queued_cmd *qc)
|
||||||
{
|
{
|
||||||
|
|
|
@ -250,8 +250,13 @@ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev)
|
||||||
if (IS_ERR(hpriv->phy)) {
|
if (IS_ERR(hpriv->phy)) {
|
||||||
rc = PTR_ERR(hpriv->phy);
|
rc = PTR_ERR(hpriv->phy);
|
||||||
switch (rc) {
|
switch (rc) {
|
||||||
case -ENODEV:
|
|
||||||
case -ENOSYS:
|
case -ENOSYS:
|
||||||
|
/* No PHY support. Check if PHY is required. */
|
||||||
|
if (of_find_property(dev->of_node, "phys", NULL)) {
|
||||||
|
dev_err(dev, "couldn't get sata-phy: ENOSYS\n");
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
case -ENODEV:
|
||||||
/* continue normally */
|
/* continue normally */
|
||||||
hpriv->phy = NULL;
|
hpriv->phy = NULL;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -4787,6 +4787,10 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
|
||||||
* ata_qc_new - Request an available ATA command, for queueing
|
* ata_qc_new - Request an available ATA command, for queueing
|
||||||
* @ap: target port
|
* @ap: target port
|
||||||
*
|
*
|
||||||
|
* Some ATA host controllers may implement a queue depth which is less
|
||||||
|
* than ATA_MAX_QUEUE. So we shouldn't allocate a tag which is beyond
|
||||||
|
* the hardware limitation.
|
||||||
|
*
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* None.
|
* None.
|
||||||
*/
|
*/
|
||||||
|
@ -4794,14 +4798,15 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
|
||||||
static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
|
static struct ata_queued_cmd *ata_qc_new(struct ata_port *ap)
|
||||||
{
|
{
|
||||||
struct ata_queued_cmd *qc = NULL;
|
struct ata_queued_cmd *qc = NULL;
|
||||||
|
unsigned int max_queue = ap->host->n_tags;
|
||||||
unsigned int i, tag;
|
unsigned int i, tag;
|
||||||
|
|
||||||
/* no command while frozen */
|
/* no command while frozen */
|
||||||
if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
|
if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (i = 0; i < ATA_MAX_QUEUE; i++) {
|
for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) {
|
||||||
tag = (i + ap->last_tag + 1) % ATA_MAX_QUEUE;
|
tag = tag < max_queue ? tag : 0;
|
||||||
|
|
||||||
/* the last tag is reserved for internal command. */
|
/* the last tag is reserved for internal command. */
|
||||||
if (tag == ATA_TAG_INTERNAL)
|
if (tag == ATA_TAG_INTERNAL)
|
||||||
|
@ -6088,6 +6093,7 @@ void ata_host_init(struct ata_host *host, struct device *dev,
|
||||||
{
|
{
|
||||||
spin_lock_init(&host->lock);
|
spin_lock_init(&host->lock);
|
||||||
mutex_init(&host->eh_mutex);
|
mutex_init(&host->eh_mutex);
|
||||||
|
host->n_tags = ATA_MAX_QUEUE - 1;
|
||||||
host->dev = dev;
|
host->dev = dev;
|
||||||
host->ops = ops;
|
host->ops = ops;
|
||||||
}
|
}
|
||||||
|
@ -6169,6 +6175,8 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
|
host->n_tags = clamp(sht->can_queue, 1, ATA_MAX_QUEUE - 1);
|
||||||
|
|
||||||
/* host must have been started */
|
/* host must have been started */
|
||||||
if (!(host->flags & ATA_HOST_STARTED)) {
|
if (!(host->flags & ATA_HOST_STARTED)) {
|
||||||
dev_err(host->dev, "BUG: trying to register unstarted host\n");
|
dev_err(host->dev, "BUG: trying to register unstarted host\n");
|
||||||
|
|
|
@ -1811,7 +1811,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
|
||||||
case ATA_DEV_ATA:
|
case ATA_DEV_ATA:
|
||||||
if (err & ATA_ICRC)
|
if (err & ATA_ICRC)
|
||||||
qc->err_mask |= AC_ERR_ATA_BUS;
|
qc->err_mask |= AC_ERR_ATA_BUS;
|
||||||
if (err & ATA_UNC)
|
if (err & (ATA_UNC | ATA_AMNF))
|
||||||
qc->err_mask |= AC_ERR_MEDIA;
|
qc->err_mask |= AC_ERR_MEDIA;
|
||||||
if (err & ATA_IDNF)
|
if (err & ATA_IDNF)
|
||||||
qc->err_mask |= AC_ERR_INVALID;
|
qc->err_mask |= AC_ERR_INVALID;
|
||||||
|
@ -2556,11 +2556,12 @@ static void ata_eh_link_report(struct ata_link *link)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->command != ATA_CMD_PACKET &&
|
if (cmd->command != ATA_CMD_PACKET &&
|
||||||
(res->feature & (ATA_ICRC | ATA_UNC | ATA_IDNF |
|
(res->feature & (ATA_ICRC | ATA_UNC | ATA_AMNF |
|
||||||
ATA_ABORTED)))
|
ATA_IDNF | ATA_ABORTED)))
|
||||||
ata_dev_err(qc->dev, "error: { %s%s%s%s}\n",
|
ata_dev_err(qc->dev, "error: { %s%s%s%s%s}\n",
|
||||||
res->feature & ATA_ICRC ? "ICRC " : "",
|
res->feature & ATA_ICRC ? "ICRC " : "",
|
||||||
res->feature & ATA_UNC ? "UNC " : "",
|
res->feature & ATA_UNC ? "UNC " : "",
|
||||||
|
res->feature & ATA_AMNF ? "AMNF " : "",
|
||||||
res->feature & ATA_IDNF ? "IDNF " : "",
|
res->feature & ATA_IDNF ? "IDNF " : "",
|
||||||
res->feature & ATA_ABORTED ? "ABRT " : "");
|
res->feature & ATA_ABORTED ? "ABRT " : "");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -915,7 +915,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
||||||
struct ep93xx_pata_data *drv_data;
|
struct ep93xx_pata_data *drv_data;
|
||||||
struct ata_host *host;
|
struct ata_host *host;
|
||||||
struct ata_port *ap;
|
struct ata_port *ap;
|
||||||
unsigned int irq;
|
int irq;
|
||||||
struct resource *mem_res;
|
struct resource *mem_res;
|
||||||
void __iomem *ide_base;
|
void __iomem *ide_base;
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -593,6 +593,7 @@ struct ata_host {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
void __iomem * const *iomap;
|
void __iomem * const *iomap;
|
||||||
unsigned int n_ports;
|
unsigned int n_ports;
|
||||||
|
unsigned int n_tags; /* nr of NCQ tags */
|
||||||
void *private_data;
|
void *private_data;
|
||||||
struct ata_port_operations *ops;
|
struct ata_port_operations *ops;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
Loading…
Add table
Reference in a new issue