Hi, On Sun, Jan 06, 2019 at 02:46:07PM +0200, Aaro Koskinen wrote: > Commit 7ff7a5b1bfff ("MIPS: lemote2f_defconfig: Convert to use libata > PATA drivers") switched from IDE to libata PATA on Loongson 2F, but > neither PATA_AMD or PATA_CS5536 work well on this platform compared > to the AMD74XX IDE driver. > > During the ATA init/probe there is interrupt storm from irq 14, and > majority of system boots end up with "nobody cared... IRQ disabled". > So the result is a very slow disk access. > > It seems that the interrupt gets crazy after the port freeze done early > during the init, and for whatever reason it cannot be cleared. > > With the below workaround I was able to boot the system normally. I > guess that rather than going back to old IDE driver, we should just try > to make pata_cs5536 work (and forget PATA AMD on this board)...? Hmm, even with this hack I get ~500 spurious IRQs during the boot. Also compared to old IDE, there's 33 vs 100 speed difference: [ 3.324000] ata1: PATA max UDMA/100 cmd 0x1f0 ctl 0x3f6 bmdma 0x4ce0 irq 14 [ 3.584000] ata1.00: ATA-8: WDC WD1600BEVS-00VAT0, 11.01A11, max UDMA/133 [ 3.588000] ata1.00: 312581808 sectors, multi 16: LBA48 [ 3.592000] ata1.00: limited to UDMA/33 due to 40-wire cable [ 4.540000] Probing IDE interface ide0... [ 4.992000] hda: WDC WD1600BEVS-00VAT0, ATA DISK drive [ 5.716000] hda: host max PIO5 wanted PIO255(auto-tune) selected PIO4 [ 5.716000] hda: UDMA/100 mode selected A. > diff --git a/drivers/ata/pata_cs5536.c b/drivers/ata/pata_cs5536.c > index dc1255294628..71e485547ee8 100644 > --- a/drivers/ata/pata_cs5536.c > +++ b/drivers/ata/pata_cs5536.c > @@ -229,6 +229,16 @@ static void cs5536_set_dmamode(struct ata_port *ap, struct ata_device *adev) > cs5536_write(pdev, ETC, etc); > } > > +static void cs5536_noop_freeze(struct ata_port *ap) > +{ > + /* > + * Some CS5536 controllers result in a screaming interrupt if ATA_NIEN > + * is manipulated. Leave it alone and just clear pending IRQ. > + */ > + ap->ops->sff_check_status(ap); > + ata_bmdma_irq_clear(ap); > +} > + > static struct scsi_host_template cs5536_sht = { > ATA_BMDMA_SHT(DRV_NAME), > }; > @@ -238,6 +248,7 @@ static struct ata_port_operations cs5536_port_ops = { > .cable_detect = cs5536_cable_detect, > .set_piomode = cs5536_set_piomode, > .set_dmamode = cs5536_set_dmamode, > + .freeze = cs5536_noop_freeze, > }; > > /**