ralinkwifi: takes rt2860 into account, untested

* remove ralink2860 driver
* added firmware for RT2860, get it onto the image
* added interrupt handler case for rt2860 devices.
This commit is contained in:
Jerome Duval
2013-01-10 21:40:49 +01:00
parent c7e76f70bc
commit af5a895fa4
6 changed files with 52 additions and 17 deletions
+1 -1
View File
@@ -170,7 +170,7 @@ SYSTEM_ADD_ONS_DRIVERS_NET = [ FFilterByBuildFeatures
aironetwifi atheroswifi broadcom43xx
iprowifi2100 iprowifi2200 iprowifi3945
iprowifi4965 marvell88w8363 marvell88w8335
ralink2860 ralinkwifi wavelanwifi
ralinkwifi wavelanwifi
}@ # x86
# WWAN drivers
@@ -26,7 +26,9 @@ KernelAddon ralinkwifi :
libfreebsd_network.a
;
HAIKU_WIFI_FIRMWARE_PACKAGE on ralinkwifi = RT61_Firmware_V1.2 ;
HAIKU_WIFI_FIRMWARE_ARCHIVE on ralinkwifi = RT61_Firmware_V1.2.zip ;
HAIKU_WIFI_FIRMWARE_PACKAGES on ralinkwifi = RT61_Firmware_V1.2
RT2860_Firmware_V26 ;
HAIKU_WIFI_FIRMWARE_ARCHIVES on ralinkwifi = RT61_Firmware_V1.2.zip
RT2860_Firmware_V26.zip ;
HAIKU_WIFI_FIRMWARE_DO_EXTRACT on ralinkwifi = true ;
@@ -1414,6 +1414,7 @@ rt2860_intr(void *arg)
RAL_LOCK(sc);
#ifndef __HAIKU__
r = RAL_READ(sc, RT2860_INT_STATUS);
if (__predict_false(r == 0xffffffff)) {
RAL_UNLOCK(sc);
@@ -1423,6 +1424,9 @@ rt2860_intr(void *arg)
RAL_UNLOCK(sc);
return; /* not for us */
}
#else
r = atomic_get((int32 *)&sc->sc_intr_status);
#endif
/* acknowledge interrupts */
RAL_WRITE(sc, RT2860_INT_STATUS, r);
@@ -196,6 +196,10 @@ struct rt2860_softc {
int sc_rxtap_len;
struct rt2860_tx_radiotap_header sc_txtap;
int sc_txtap_len;
#if defined(__HAIKU__)
uint32_t sc_intr_status;
#endif
};
int rt2860_attach(device_t, int);
@@ -19,13 +19,16 @@
#include <dev/ral/rt2560reg.h>
#include <dev/ral/rt2560var.h>
#include <dev/ral/rt2860reg.h>
#include <dev/ral/rt2860var.h>
HAIKU_FBSD_WLAN_DRIVER_GLUE(ralinkwifi, ral, pci)
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN);
HAIKU_FIRMWARE_VERSION(0);
HAIKU_FIRMWARE_NAME_MAP(3) = {{"rt2561fw", "rt2561.bin"},
{"rt2561sfw", "rt2561s.bin"}, {"rt2661fw", "rt2661.bin"}};
HAIKU_FIRMWARE_NAME_MAP(4) = {{"rt2561fw", "rt2561.bin"},
{"rt2561sfw", "rt2561s.bin"}, {"rt2661fw", "rt2661.bin"},
{"rt2860fw", "rt2860.bin"}};
NO_HAIKU_FBSD_MII_DRIVER();
NO_HAIKU_REENABLE_INTERRUPTS();
@@ -39,21 +42,43 @@ int
HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev)
{
struct rt2560_softc* sc = (struct rt2560_softc*)device_get_softc(dev);
// assuming that rt2560 and rt2661 share a common context data structure
// sc_ifp is common between context data structures
struct ifnet* ifp = sc->sc_ifp;
if (pci_get_device(dev) == 0x0201) {
// disable interrupts
RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
} else {
// disable MAC and MCU interrupts
RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f);
RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
}
switch (pci_get_device(dev)) {
case 0x0201:
// disable interrupts
RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
// don't re-enable interrupts if we're shutting down
return 0;
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
// don't re-enable interrupts if we're shutting down
return 0;
}
break;
case 0x0301:
case 0x0302:
case 0x0401:
// disable MAC and MCU interrupts
RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f);
RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
// don't re-enable interrupts if we're shutting down
return 0;
}
break;
default:
{
uint32 r;
struct rt2860_softc* sc =
(struct rt2860_softc*)device_get_softc(dev);
r = RAL_READ(sc, RT2860_INT_STATUS);
if (r == 0 || r == 0xffffffff)
return 0;
atomic_set((int32*)&sc->sc_intr_status, r);
break;
}
}
return 1;