42#include <sys/malloc.h>
43#include <sys/module.h>
44#include <sys/kernel.h>
49#include <machine/bus.h>
50#include <machine/resource.h>
54#include <sys/socket.h>
57#include <net/if_media.h>
58#include <net/if_arp.h>
59#include <net/ethernet.h>
61#include <net80211/ieee80211_var.h>
65#include <dev/pci/pcivar.h>
66#include <dev/pci/pcireg.h>
69#ifdef ATH_EEPROM_FIRMWARE
70#include <sys/linker.h>
71#include <sys/firmware.h>
85#define PCI_VDEVICE(v, d) \
88#define PCI_DEVICE_SUB(v, d, sv, sd) \
89 PCI_DEV(v, d), PCI_SUBDEV(sv, sd)
91#define PCI_VENDOR_ID_ATHEROS 0x168c
92#define PCI_VENDOR_ID_SAMSUNG 0x144d
93#define PCI_VENDOR_ID_AZWAVE 0x1a3b
94#define PCI_VENDOR_ID_FOXCONN 0x105b
95#define PCI_VENDOR_ID_ATTANSIC 0x1969
96#define PCI_VENDOR_ID_ASUSTEK 0x1043
97#define PCI_VENDOR_ID_DELL 0x1028
98#define PCI_VENDOR_ID_QMI 0x1a32
99#define PCI_VENDOR_ID_LENOVO 0x17aa
100#define PCI_VENDOR_ID_HP 0x103c
105#define PCIR_RETRY_TIMEOUT 0x41
106#define PCIR_CFG_PMCSR 0x48
108#define DEFAULT_CACHESIZE 32
121 cz = pci_read_config(dev, PCIR_CACHELNSZ, 1);
123 pci_write_config(dev, PCIR_CACHELNSZ,
128 pci_write_config(dev, PCIR_LATTIMER, 0xa8, 1);
131#ifdef ATH_PCI_WAKEUP_WAR
155 devname =
ath_hal_probe(pci_get_vendor(dev), pci_get_device(dev));
156 if (devname != NULL) {
157 device_set_desc(dev, devname);
158 return BUS_PROBE_DEFAULT;
170#ifdef ATH_EEPROM_FIRMWARE
171 const struct firmware *fw = NULL;
174 const struct pci_device_table *pd;
186 pci_enable_busmaster(dev);
197 psc->
sc_sr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
199 if (psc->
sc_sr == NULL) {
200 device_printf(dev,
"cannot map register space\n");
221 psc->
sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
222 RF_SHAREABLE|RF_ACTIVE);
223 if (psc->
sc_irq == NULL) {
224 device_printf(dev,
"could not map interrupt\n");
227 if (bus_setup_intr(dev, psc->
sc_irq,
228 INTR_TYPE_NET | INTR_MPSAFE,
230 device_printf(dev,
"could not establish interrupt\n");
237 if (bus_dma_tag_create(bus_get_dma_tag(dev),
239 BUS_SPACE_MAXADDR_32BIT,
249 device_printf(dev,
"cannot allocate DMA tag\n");
253#ifdef ATH_EEPROM_FIRMWARE
257 if (resource_string_value(device_get_name(dev), device_get_unit(dev),
258 "eeprom_firmware", &buf) == 0) {
260 device_printf(dev,
"%s: looking up firmware @ '%s'\n",
263 fw = firmware_get(buf);
265 device_printf(dev,
"%s: couldn't find firmware\n",
270 device_printf(dev,
"%s: EEPROM firmware @ %p\n",
273 malloc(fw->datasize, M_TEMP, M_WAITOK | M_ZERO);
275 device_printf(dev,
"%s: can't malloc eepromdata\n",
288#ifdef ATH_EEPROM_FIRMWARE
291 bus_dma_tag_destroy(sc->
sc_dmat);
295 bus_release_resource(dev, SYS_RES_IRQ, 0, psc->
sc_irq);
297 bus_release_resource(dev, SYS_RES_MEMORY,
BS_BAR, psc->
sc_sr);
321 (void) pci_read_config(dev, PCIR_COMMAND, 4);
325 bus_generic_detach(dev);
327 bus_release_resource(dev, SYS_RES_IRQ, 0, psc->
sc_irq);
329 bus_dma_tag_destroy(sc->
sc_dmat);
330 bus_release_resource(dev, SYS_RES_MEMORY,
BS_BAR, psc->
sc_sr);
const char * ath_hal_probe(uint16_t vendorid, uint16_t devid)
bus_space_tag_t HAL_BUS_TAG
bus_space_handle_t HAL_BUS_HANDLE
int ath_detach(struct ath_softc *sc)
void ath_shutdown(struct ath_softc *sc)
void ath_resume(struct ath_softc *sc)
void ath_suspend(struct ath_softc *sc)
int ath_attach(u_int16_t devid, struct ath_softc *sc)
static int ath_pci_shutdown(device_t dev)
#define DEFAULT_CACHESIZE
DRIVER_MODULE(if_ath_pci, pci, ath_pci_driver, ath_devclass, 0, 0)
static int ath_pci_attach(device_t dev)
static driver_t ath_pci_driver
MODULE_DEPEND(if_ath_pci, wlan, 1, 1, 1)
static device_method_t ath_pci_methods[]
MODULE_VERSION(if_ath_pci, 1)
static int ath_pci_suspend(device_t dev)
static int ath_pci_resume(device_t dev)
#define PCIR_RETRY_TIMEOUT
static int ath_pci_probe(device_t dev)
static void ath_pci_setup(device_t dev)
static devclass_t ath_devclass
static int ath_pci_detach(device_t dev)
static const struct pci_device_table ath_pci_id_table[]
#define ATH_PCU_LOCK_DESTROY(_sc)
#define ATH_LOCK_INIT(_sc)
#define ATH_TX_LOCK_INIT(_sc)
#define ATH_LOCK_DESTROY(_sc)
#define ATH_RX_LOCK_DESTROY(_sc)
#define ATH_PCU_LOCK_INIT(_sc)
#define ATH_TX_LOCK_DESTROY(_sc)
#define ATH_RX_LOCK_INIT(_sc)
#define ATH_TXSTATUS_LOCK_INIT(_sc)
#define ATH_TXSTATUS_LOCK_DESTROY(_sc)