pcnet: adapted glue.c with le driver changes
* the driver doesn't crash anymore, but only sends a few packets
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
#include <sys/bus.h>
|
#include <sys/bus.h>
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
|
#include <sys/rman.h>
|
||||||
|
|
||||||
#include <net/ethernet.h>
|
#include <net/ethernet.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
@@ -24,12 +25,8 @@ NO_HAIKU_REENABLE_INTERRUPTS();
|
|||||||
struct le_pci_softc {
|
struct le_pci_softc {
|
||||||
struct am79900_softc sc_am79900; /* glue to MI code */
|
struct am79900_softc sc_am79900; /* glue to MI code */
|
||||||
|
|
||||||
int sc_rrid;
|
|
||||||
struct resource *sc_rres;
|
struct resource *sc_rres;
|
||||||
bus_space_tag_t sc_regt;
|
|
||||||
bus_space_handle_t sc_regh;
|
|
||||||
|
|
||||||
int sc_irid;
|
|
||||||
struct resource *sc_ires;
|
struct resource *sc_ires;
|
||||||
void *sc_ih;
|
void *sc_ih;
|
||||||
|
|
||||||
@@ -41,28 +38,29 @@ struct le_pci_softc {
|
|||||||
int HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) {
|
int HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) {
|
||||||
struct le_pci_softc *lesc = (struct le_pci_softc *)device_get_softc(dev);
|
struct le_pci_softc *lesc = (struct le_pci_softc *)device_get_softc(dev);
|
||||||
HAIKU_INTR_REGISTER_STATE;
|
HAIKU_INTR_REGISTER_STATE;
|
||||||
uint16_t value;
|
uint16_t isr;
|
||||||
|
|
||||||
HAIKU_INTR_REGISTER_ENTER();
|
HAIKU_INTR_REGISTER_ENTER();
|
||||||
|
|
||||||
/* get current flags */
|
/* get current flags */
|
||||||
bus_space_write_2(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RAP, LE_CSR0);
|
bus_write_2(lesc->sc_rres, PCNET_PCI_RAP, LE_CSR0);
|
||||||
bus_space_barrier(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RAP, 2,
|
bus_barrier(lesc->sc_rres, PCNET_PCI_RAP, 2, BUS_SPACE_BARRIER_WRITE);
|
||||||
BUS_SPACE_BARRIER_WRITE);
|
isr = (bus_read_2(lesc->sc_rres, PCNET_PCI_RDP));
|
||||||
value = bus_space_read_2(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RDP);
|
|
||||||
|
|
||||||
/* is there a pending interrupt? */
|
/* is there a pending interrupt? */
|
||||||
if (value & LE_C0_INTR) {
|
if ((isr & LE_C0_INTR) == 0) {
|
||||||
/* set the new flags, disable interrupts */
|
HAIKU_INTR_REGISTER_LEAVE();
|
||||||
bus_space_write_2(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RAP, LE_CSR0);
|
return 0;
|
||||||
bus_space_barrier(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RAP, 2,
|
|
||||||
BUS_SPACE_BARRIER_WRITE);
|
|
||||||
bus_space_write_2(lesc->sc_regt, lesc->sc_regh, PCNET_PCI_RDP,
|
|
||||||
value & ~LE_C0_INEA);
|
|
||||||
lesc->sc_am79900.lsc.sc_lastisr |= value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set the new flags, disable interrupts */
|
||||||
|
bus_write_2(lesc->sc_rres, PCNET_PCI_RAP, LE_CSR0);
|
||||||
|
bus_barrier(lesc->sc_rres, PCNET_PCI_RAP, 2, BUS_SPACE_BARRIER_WRITE);
|
||||||
|
bus_write_2(lesc->sc_rres, PCNET_PCI_RDP, isr & ~(LE_C0_INEA));
|
||||||
|
|
||||||
|
lesc->sc_am79900.lsc.sc_lastisr |= isr;
|
||||||
|
|
||||||
HAIKU_INTR_REGISTER_LEAVE();
|
HAIKU_INTR_REGISTER_LEAVE();
|
||||||
|
|
||||||
return value & LE_C0_INTR;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user