at_wini: enable busmastering in pci if necessary

This commit is contained in:
Ben Gras 2013-05-18 13:24:23 +00:00
parent e8681e9929
commit 225ed6d7bd

View file

@ -411,6 +411,18 @@ static int quirkmatch(struct quirk *table, u8_t bcr, u8_t scr, u8_t interface, u
return 0; return 0;
} }
static void
pci_busmaster(int devind)
{
u16_t cr;
/* Enable busmastering if necessary. */
cr = pci_attr_r16(devind, PCI_CR);
if (!(cr & PCI_CR_MAST_EN)) {
pci_attr_w16(devind, PCI_CR, cr | PCI_CR_MAST_EN);
}
}
/*===========================================================================* /*===========================================================================*
* init_params_pci * * init_params_pci *
*===========================================================================*/ *===========================================================================*/
@ -475,6 +487,7 @@ static void init_params_pci(int skip)
w_instance, devind); w_instance, devind);
continue; continue;
} }
pci_busmaster(devind);
if (sys_irqsetpolicy(irq, 0, &irq_hook) != OK) { if (sys_irqsetpolicy(irq, 0, &irq_hook) != OK) {
printf("atapci: couldn't set IRQ policy %d\n", irq); printf("atapci: couldn't set IRQ policy %d\n", irq);
continue; continue;
@ -562,7 +575,7 @@ static void init_params_pci(int skip)
if(pci_reserve_ok(devind) != OK) { if(pci_reserve_ok(devind) != OK) {
printf("at_wini%ld (compat): pci_reserve %d failed!\n", printf("at_wini%ld (compat): pci_reserve %d failed!\n",
w_instance, devind); w_instance, devind);
} } else pci_busmaster(devind);
} }
} }
} }