Skip to content

Commit

Permalink
sata_dwc_460ex: support hardreset
Browse files Browse the repository at this point in the history
The hardreset operation is currently not supported. This causes
sometime the SATA driver does cause kernel crash because of
none-determined state.a This patch will fix the issue.

Signed-off-by: Thang Q. Nguyen <tqnguyen@apm.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Thang Q. Nguyen authored and Jeff Garzik committed Jul 25, 2012
1 parent 2fc75da commit 3a8b788
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion drivers/ata/sata_dwc_460ex.c
Original file line number Diff line number Diff line change
Expand Up @@ -1581,10 +1581,31 @@ static void sata_dwc_qc_prep(struct ata_queued_cmd *qc)

static void sata_dwc_error_handler(struct ata_port *ap)
{
ap->link.flags |= ATA_LFLAG_NO_HRST;
ata_sff_error_handler(ap);
}

int sata_dwc_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline)
{
struct sata_dwc_device *hsdev = HSDEV_FROM_AP(link->ap);
int ret;

ret = sata_sff_hardreset(link, class, deadline);

sata_dwc_enable_interrupts(hsdev);

/* Reconfigure the DMA control register */
out_le32(&hsdev->sata_dwc_regs->dmacr,
SATA_DWC_DMACR_TXRXCH_CLEAR);

/* Reconfigure the DMA Burst Transaction Size register */
out_le32(&hsdev->sata_dwc_regs->dbtsr,
SATA_DWC_DBTSR_MWR(AHB_DMA_BRST_DFLT) |
SATA_DWC_DBTSR_MRD(AHB_DMA_BRST_DFLT));

return ret;
}

/*
* scsi mid-layer and libata interface structures
*/
Expand All @@ -1604,6 +1625,7 @@ static struct ata_port_operations sata_dwc_ops = {
.inherits = &ata_sff_port_ops,

.error_handler = sata_dwc_error_handler,
.hardreset = sata_dwc_hardreset,

.qc_prep = sata_dwc_qc_prep,
.qc_issue = sata_dwc_qc_issue,
Expand Down

0 comments on commit 3a8b788

Please sign in to comment.