Skip to content

Commit

Permalink
pcnet: add pcn driver
Browse files Browse the repository at this point in the history
* le still working ok with QEmu
* pcn brings support for the following devices in 32-bit mode (instead of 16-bit Lance
compatibility mode), all untested, feedback is welcome.
AMD Am79C971 PCnet-FAST, AMD Am79C972 PCnet-FAST+, AMD Am79C973/Am79C975 PCnet-FAST III,
AMD Am79C976 PCnet-PRO, AMD Am79C978 PCnet-Home, Allied-Telesis LA-PCI
* added PHY nsphy, nsphyter and ukphy, which seem the ones needed for pcn.
* synched miidevs with FreeBSD 9.2
  • Loading branch information
korli committed Oct 12, 2013
1 parent 5de589d commit 47fe776
Show file tree
Hide file tree
Showing 15 changed files with 3,431 additions and 8 deletions.
2 changes: 2 additions & 0 deletions src/add-ons/kernel/drivers/network/pcnet/dev/Jamfile
@@ -1,3 +1,5 @@
SubDir HAIKU_TOP src add-ons kernel drivers network pcnet dev ;

SubInclude HAIKU_TOP src add-ons kernel drivers network pcnet dev le ;
SubInclude HAIKU_TOP src add-ons kernel drivers network pcnet dev mii ;
SubInclude HAIKU_TOP src add-ons kernel drivers network pcnet dev pcn ;
3 changes: 2 additions & 1 deletion src/add-ons/kernel/drivers/network/pcnet/dev/le/Jamfile
@@ -1,6 +1,7 @@
SubDir HAIKU_TOP src add-ons kernel drivers network pcnet dev le ;

UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network ] : true ;
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : true ;

UsePrivateHeaders net system ;
Expand All @@ -14,5 +15,5 @@ KernelAddon pcnet :
if_le_pci.c
lance.c
glue.c
: libfreebsd_network.a
: libfreebsd_network.a pcnet_pcn.a pcnet_mii.a
;
88 changes: 82 additions & 6 deletions src/add-ons/kernel/drivers/network/pcnet/dev/le/glue.c
Expand Up @@ -7,16 +7,91 @@
#include <net/if_media.h>

#include <machine/bus.h>
#include <shared.h>

#include <dev/le/lancereg.h>
#include <dev/le/lancevar.h>
#include <dev/le/am79900var.h>

HAIKU_FBSD_DRIVER_GLUE(pcnet, le, pci);
HAIKU_FBSD_DRIVERS_GLUE(pcnet);
HAIKU_DRIVER_REQUIREMENTS(0);
NO_HAIKU_FBSD_MII_DRIVER();

NO_HAIKU_REENABLE_INTERRUPTS();
extern driver_t *DRIVER_MODULE_NAME(nsphy, miibus);
extern driver_t *DRIVER_MODULE_NAME(nsphyter, miibus);
extern driver_t *DRIVER_MODULE_NAME(ukphy, miibus);


driver_t *
__haiku_select_miibus_driver(device_t dev)
{
driver_t *drivers[] = {
DRIVER_MODULE_NAME(nsphy, miibus),
DRIVER_MODULE_NAME(nsphyter, miibus),
DRIVER_MODULE_NAME(ukphy, miibus),
NULL
};

return __haiku_probe_miibus(dev, drivers);
}

int check_disable_interrupts_le(device_t dev);
void reenable_interrupts_le(device_t dev);

extern int check_disable_interrupts_pcn(device_t dev);
extern void reenable_interrupts_pcn(device_t dev);


extern driver_t *DRIVER_MODULE_NAME(le, pci);
extern driver_t *DRIVER_MODULE_NAME(pcn, pci);


status_t
__haiku_handle_fbsd_drivers_list(status_t (*handler)(driver_t *[]))
{
driver_t *drivers[] = {
DRIVER_MODULE_NAME(le, pci),
DRIVER_MODULE_NAME(pcn, pci),
NULL
};
return (*handler)(drivers);
}


int
HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev)
{
switch (dev->device_name[0]) {
case 'l':
return check_disable_interrupts_le(dev);
case 'p':
return check_disable_interrupts_pcn(dev);
default:
break;
}

panic("Unsupported device: %#x (%s)!", dev->device_name[0],
dev->device_name);
return 0;
}


void
HAIKU_REENABLE_INTERRUPTS(device_t dev)
{
switch (dev->device_name[0]) {
case 'l':
break;
case 'p':
reenable_interrupts_pcn(dev);
break;
default:
panic("Unsupported device: %#x (%s)!", dev->device_name[0],
dev->device_name);
break;
}
}



/* from if_le_pci.c */
#define PCNET_PCI_RDP 0x10
Expand All @@ -35,7 +110,8 @@ struct le_pci_softc {
bus_dmamap_t sc_dmam;
};

int HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) {
int
check_disable_interrupts_le(device_t dev) {
struct le_pci_softc *lesc = (struct le_pci_softc *)device_get_softc(dev);
HAIKU_INTR_REGISTER_STATE;
uint16_t isr;
Expand All @@ -57,9 +133,9 @@ int HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) {
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();

return 1;
Expand Down
23 changes: 23 additions & 0 deletions src/add-ons/kernel/drivers/network/pcnet/dev/mii/Jamfile
@@ -0,0 +1,23 @@
SubDir HAIKU_TOP src add-ons kernel drivers network pcnet dev mii ;

UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : true ;

UsePrivateHeaders net system ;
UsePrivateKernelHeaders ;

SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;

KernelStaticLibrary pcnet_mii.a
:
nsphy.c
nsphyter.c
ukphy.c
ukphy_subr.c
;

ObjectHdrs [ FGristFiles nsphy$(SUFOBJ) nsphyter$(SUFOBJ) ]
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs
compat freebsd_network ] ;
Includes [ FGristFiles nsphy.c nsphyter.c ]
: <src!libs!compat!freebsd_network>miidevs.h ;

0 comments on commit 47fe776

Please sign in to comment.