X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/f2b87dd63dc50a707ac102db7afb849b1f4f8db0..7519e35d837ff5ee4303ba6f335d0f3647aab1c3:/aseg/firstrun.c?ds=sidebyside diff --git a/aseg/firstrun.c b/aseg/firstrun.c index 9589a13..75bcccc 100644 --- a/aseg/firstrun.c +++ b/aseg/firstrun.c @@ -2,11 +2,48 @@ #include #include #include +#include #include "vga-overlay.h" #include extern int _bss, _bssend; +extern void timer_handler(smi_event_t ev); +extern void kbc_handler(smi_event_t ev); +extern void gbl_rls_handler(smi_event_t ev); + +static int found = 0, _bus, _dev, _fn; + +void do_bother() +{ + int bar; + + if (!found) + return; + + pci_write16(_bus, _dev, _fn, 0x04, 0x00); + for (bar = 0; bar < 6; bar++) + pci_write32(_bus, _dev, _fn, 0x10 + bar*4, 0x1FFFFFFF); +} + +int bother_3c905(pci_dev_t *dev) +{ + if (dev->vid == 0x10B7 || dev->did == 0x9200) + { + outputf("Found a 3c905 to bother"); + + _bus = dev->bus; + _dev = dev->dev; + _fn = dev->fn; + found = 1; + + do_bother(); + + return 1; + } + return 0; +} + void __firstrun_start() { unsigned char *bp; smram_state_t smram; @@ -17,7 +54,7 @@ void __firstrun_start() { for (bp = (void *)&_bss; (void *)bp < (void *)&_bssend; bp++) *bp = 0; - dologf("NetWatch running"); + outputf("NetWatch running"); /* Try really hard to shut up USB_LEGKEY. */ pci_write16(0, 31, 2, 0xC0, pci_read16(0, 31, 2, 0xC0)); @@ -26,8 +63,19 @@ void __firstrun_start() { pci_write16(0, 31, 4, 0xC0, 0); /* Turn on the SMIs we want */ - outb(0x830, inb(0x830) | ICH2_SMI_EN_SWSMI_TMR_EN); - outb(0x848, ICH2_DEVTRAP_EN_KBC_TRP_EN); + smi_disable(); + + pci_probe(bother_3c905); + + smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler); + smi_enable_event(SMI_EVENT_FAST_TIMER); + + smi_register_handler(SMI_EVENT_DEVTRAP_KBC, kbc_handler); + smi_enable_event(SMI_EVENT_DEVTRAP_KBC); + + smi_register_handler(SMI_EVENT_GBL_RLS, gbl_rls_handler); + smi_enable_event(SMI_EVENT_GBL_RLS); + smi_enable(); smram_restore_state(smram);