mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-26 22:52:34 +02:00
Remove potential endless loops from satasii.c
Corresponding to flashrom svn r1588. This is based on the idea from the "Make satasii driver more robust" patch Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> It factors out the wait loop and replaces all potential endless loops instead of just a few. Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
This commit is contained in:
parent
e3adea0864
commit
250c321a9d
27
satasii.c
27
satasii.c
@ -61,6 +61,20 @@ static int satasii_shutdown(void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t satasii_wait_done(void)
|
||||||
|
{
|
||||||
|
uint32_t ctrl_reg;
|
||||||
|
int i = 0;
|
||||||
|
while ((ctrl_reg = pci_mmio_readl(sii_bar)) & (1 << 25)) {
|
||||||
|
if (++i > 10000) {
|
||||||
|
msg_perr("%s: control register stuck at %08x, ignoring.\n",
|
||||||
|
__func__, pci_mmio_readl(sii_bar));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ctrl_reg;
|
||||||
|
}
|
||||||
|
|
||||||
int satasii_init(void)
|
int satasii_init(void)
|
||||||
{
|
{
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
@ -97,9 +111,8 @@ int satasii_init(void)
|
|||||||
|
|
||||||
static void satasii_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
|
static void satasii_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
|
||||||
{
|
{
|
||||||
uint32_t ctrl_reg, data_reg;
|
uint32_t data_reg;
|
||||||
|
uint32_t ctrl_reg = satasii_wait_done();
|
||||||
while ((ctrl_reg = pci_mmio_readl(sii_bar)) & (1 << 25)) ;
|
|
||||||
|
|
||||||
/* Mask out unused/reserved bits, set writes and start transaction. */
|
/* Mask out unused/reserved bits, set writes and start transaction. */
|
||||||
ctrl_reg &= 0xfcf80000;
|
ctrl_reg &= 0xfcf80000;
|
||||||
@ -109,14 +122,12 @@ static void satasii_chip_writeb(const struct flashctx *flash, uint8_t val, chipa
|
|||||||
pci_mmio_writel(data_reg, (sii_bar + 4));
|
pci_mmio_writel(data_reg, (sii_bar + 4));
|
||||||
pci_mmio_writel(ctrl_reg, sii_bar);
|
pci_mmio_writel(ctrl_reg, sii_bar);
|
||||||
|
|
||||||
while (pci_mmio_readl(sii_bar) & (1 << 25)) ;
|
satasii_wait_done();
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t satasii_chip_readb(const struct flashctx *flash, const chipaddr addr)
|
static uint8_t satasii_chip_readb(const struct flashctx *flash, const chipaddr addr)
|
||||||
{
|
{
|
||||||
uint32_t ctrl_reg;
|
uint32_t ctrl_reg = satasii_wait_done();
|
||||||
|
|
||||||
while ((ctrl_reg = pci_mmio_readl(sii_bar)) & (1 << 25)) ;
|
|
||||||
|
|
||||||
/* Mask out unused/reserved bits, set reads and start transaction. */
|
/* Mask out unused/reserved bits, set reads and start transaction. */
|
||||||
ctrl_reg &= 0xfcf80000;
|
ctrl_reg &= 0xfcf80000;
|
||||||
@ -124,7 +135,7 @@ static uint8_t satasii_chip_readb(const struct flashctx *flash, const chipaddr a
|
|||||||
|
|
||||||
pci_mmio_writel(ctrl_reg, sii_bar);
|
pci_mmio_writel(ctrl_reg, sii_bar);
|
||||||
|
|
||||||
while (pci_mmio_readl(sii_bar) & (1 << 25)) ;
|
satasii_wait_done();
|
||||||
|
|
||||||
return (pci_mmio_readl(sii_bar + 4)) & 0xff;
|
return (pci_mmio_readl(sii_bar + 4)) & 0xff;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user