iPXE
ath9k.c File Reference
#include <ipxe/pci.h>
#include "ath9k.h"

Go to the source code of this file.

Functions

 FILE_SECBOOT (FORBIDDEN)
static void ath_pci_read_cachesize (struct ath_common *common, int *csz)
static int ath_pci_eeprom_read (struct ath_common *common, u32 off, u16 *data)
static void ath_pci_extn_synch_enable (struct ath_common *common)
static int ath_pci_probe (struct pci_device *pdev)
static void ath_pci_remove (struct pci_device *pdev)

Variables

static struct pci_device_id ath_pci_id_table []
static const struct ath_bus_ops ath_pci_bus_ops
struct pci_driver ath_pci_driver __pci_driver

Function Documentation

◆ FILE_SECBOOT()

FILE_SECBOOT ( FORBIDDEN )

◆ ath_pci_read_cachesize()

void ath_pci_read_cachesize ( struct ath_common * common,
int * csz )
static

Definition at line 42 of file ath9k.c.

43{
44 struct ath_softc *sc = (struct ath_softc *) common->priv;
45 u8 u8tmp;
46
48 *csz = (int)u8tmp;
49
50 /*
51 * This check was put in to avoid "unpleasant" consequences if
52 * the bootrom has not fully initialized all PCI devices.
53 * Sometimes the cache line size register is not set
54 */
55
56 if (*csz == 0)
57 *csz = DEFAULT_CACHELINE >> 2; /* Use the default size */
58}
#define DEFAULT_CACHELINE
Definition ath9k.h:354
struct ib_cm_common common
Definition ib_mad.h:0
#define u8
Definition igbvf_osdep.h:40
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.
#define PCI_CACHE_LINE_SIZE
PCI cache line size.
Definition pci.h:48

References common, DEFAULT_CACHELINE, PCI_CACHE_LINE_SIZE, pci_read_config_byte(), ath_softc::pdev, and u8.

◆ ath_pci_eeprom_read()

int ath_pci_eeprom_read ( struct ath_common * common,
u32 off,
u16 * data )
static

Definition at line 60 of file ath9k.c.

61{
62 struct ath_hw *ah = (struct ath_hw *) common->ah;
63
64 common->ops->read(ah, AR5416_EEPROM_OFFSET +
65 (off << AR5416_EEPROM_S));
66
67 if (!ath9k_hw_wait(ah,
72 return 0;
73 }
74
75 *data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA),
77
78 return 1;
79}
#define AR5416_EEPROM_OFFSET
Definition eeprom.h:62
#define AR5416_EEPROM_S
Definition eeprom.h:61
#define AR_EEPROM_STATUS_DATA_VAL
Definition reg.h:1088
#define AR_EEPROM_STATUS_DATA_BUSY
Definition reg.h:1090
#define AR_EEPROM_STATUS_DATA
Definition reg.h:1086
#define AR_EEPROM_STATUS_DATA_PROT_ACCESS
Definition reg.h:1092
int ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
Definition ath9k_hw.c:95
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define MS(_v, _f)
Definition hw.h:103
#define AH_WAIT_TIMEOUT
Definition hw.h:146
uint8_t ah
Definition registers.h:1
Definition hw.h:657

References ah, AH_WAIT_TIMEOUT, AR5416_EEPROM_OFFSET, AR5416_EEPROM_S, AR_EEPROM_STATUS_DATA, AR_EEPROM_STATUS_DATA_BUSY, AR_EEPROM_STATUS_DATA_PROT_ACCESS, AR_EEPROM_STATUS_DATA_VAL, ath9k_hw_wait(), common, data, MS, u16, and u32.

◆ ath_pci_extn_synch_enable()

void ath_pci_extn_synch_enable ( struct ath_common * common)
static

Definition at line 81 of file ath9k.c.

82{
83 struct ath_softc *sc = (struct ath_softc *) common->priv;
84 struct pci_device *pdev = sc->pdev;
85 u8 lnkctl;
86
87 pci_read_config_byte(pdev, sc->sc_ah->caps.pcie_lcr_offset, &lnkctl);
88 lnkctl |= 0x0080;
89 pci_write_config_byte(pdev, sc->sc_ah->caps.pcie_lcr_offset, lnkctl);
90}
int pci_write_config_byte(struct pci_device *pci, unsigned int where, uint8_t value)
Write byte to PCI configuration space.
A PCI device.
Definition pci.h:211

References ath_hw::caps, common, pci_read_config_byte(), pci_write_config_byte(), ath9k_hw_capabilities::pcie_lcr_offset, ath_softc::pdev, ath_softc::sc_ah, and u8.

◆ ath_pci_probe()

int ath_pci_probe ( struct pci_device * pdev)
static

Definition at line 99 of file ath9k.c.

100{
101 void *mem;
102 struct ath_softc *sc;
103 struct net80211_device *dev;
104 u8 csz;
105 u16 subsysid;
106 u32 val;
107 int ret = 0;
108 char hw_name[64];
109
110 adjust_pci_device(pdev);
111
112 /*
113 * Cache line size is used to size and align various
114 * structures used to communicate with the hardware.
115 */
117 if (csz == 0) {
118 /*
119 * Linux 2.4.18 (at least) writes the cache line size
120 * register as a 16-bit wide register which is wrong.
121 * We must have this setup properly for rx buffer
122 * DMA to work so force a reasonable value here if it
123 * comes up zero.
124 */
125 csz =16;
127 }
128 /*
129 * The default setting of latency timer yields poor results,
130 * set it to the value used by other systems. It may be worth
131 * tweaking this setting more.
132 */
134
135 /*
136 * Disable the RETRY_TIMEOUT register (0x41) to keep
137 * PCI Tx retries from interfering with C3 CPU state.
138 */
139 pci_read_config_dword(pdev, 0x40, &val);
140 if ((val & 0x0000ff00) != 0)
141 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
142
143 mem = pci_ioremap(pdev, pdev->membase, 0x10000);
144 if (!mem) {
145 DBG("ath9K: PCI memory map error\n") ;
146 ret = -EIO;
147 goto err_iomap;
148 }
149
150 dev = net80211_alloc(sizeof(struct ath_softc));
151 if (!dev) {
152 DBG("ath9k: No memory for net80211_device\n");
153 ret = -ENOMEM;
154 goto err_alloc_hw;
155 }
156
157 pci_set_drvdata(pdev, dev);
158 dev->netdev->dev = (struct device *)pdev;
159
160 sc = dev->priv;
161 sc->dev = dev;
162 sc->pdev = pdev;
163 sc->mem = mem;
164
165 /* Will be cleared in ath9k_start() */
166 sc->sc_flags |= SC_OP_INVALID;
167
168 sc->irq = pdev->irq;
169
170 pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsysid);
171 ret = ath9k_init_device(pdev->device, sc, subsysid, &ath_pci_bus_ops);
172 if (ret) {
173 DBG("ath9k: Failed to initialize device\n");
174 goto err_init;
175 }
176
177 ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
178 DBG("ath9k: %s mem=0x%lx, irq=%d\n",
179 hw_name, (unsigned long)mem, pdev->irq);
180
181 return 0;
182
183err_init:
184 net80211_free(dev);
185err_alloc_hw:
186 iounmap(mem);
187err_iomap:
188 return ret;
189}
static const struct ath_bus_ops ath_pci_bus_ops
Definition ath9k.c:92
#define SC_OP_INVALID
Definition ath9k.h:363
int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, const struct ath_bus_ops *bus_ops)
Definition ath9k_init.c:487
void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len)
Definition ath9k_hw.c:2047
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
struct net80211_device * net80211_alloc(size_t priv_size)
Allocate 802.11 device.
Definition net80211.c:755
void net80211_free(struct net80211_device *dev)
Free 802.11 device.
Definition net80211.c:839
#define ENOMEM
Not enough space.
Definition errno.h:535
#define EIO
Input/output error.
Definition errno.h:434
void iounmap(volatile const void *io_addr)
Unmap I/O address.
int pci_read_config_dword(struct pci_device *pci, unsigned int where, uint32_t *value)
Read 32-bit dword from PCI configuration space.
int pci_read_config_word(struct pci_device *pci, unsigned int where, uint16_t *value)
Read 16-bit word from PCI configuration space.
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
int pci_write_config_dword(struct pci_device *pci, unsigned int where, uint32_t value)
Write 32-bit dword to PCI configuration space.
void __asmcall int val
Definition setjmp.h:12
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition pci.c:241
#define PCI_SUBSYSTEM_ID
PCI subsystem ID.
Definition pci.h:79
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition pci.h:366
#define PCI_LATENCY_TIMER
PCI latency timer.
Definition pci.h:51
struct pci_device * pdev
Definition ath9k.h:447
void * mem
Definition ath9k.h:456
struct net80211_device * dev
Definition ath9k.h:446
u32 sc_flags
Definition ath9k.h:466
int irq
Definition ath9k.h:457
struct ath_hw * sc_ah
Definition ath9k.h:455
A hardware device.
Definition device.h:77
Structure encapsulating the complete state of an 802.11 device.
Definition net80211.h:787
struct net_device * netdev
The net_device that wraps us.
Definition net80211.h:789
void * priv
Driver private data.
Definition net80211.h:798
struct device * dev
Underlying hardware device.
Definition netdevice.h:365
unsigned long membase
Memory base.
Definition pci.h:220
uint8_t irq
Interrupt number.
Definition pci.h:234
uint16_t device
Device ID.
Definition pci.h:230
#define u16
Definition vga.h:20
#define u32
Definition vga.h:21

References adjust_pci_device(), ath9k_hw_name(), ath9k_init_device(), ath_pci_bus_ops, DBG, ath_softc::dev, net_device::dev, pci_device::device, EIO, ENOMEM, iounmap(), ath_softc::irq, pci_device::irq, ath_softc::mem, pci_device::membase, net80211_alloc(), net80211_free(), net80211_device::netdev, PCI_CACHE_LINE_SIZE, pci_ioremap(), PCI_LATENCY_TIMER, pci_read_config_byte(), pci_read_config_dword(), pci_read_config_word(), pci_set_drvdata(), PCI_SUBSYSTEM_ID, pci_write_config_byte(), pci_write_config_dword(), ath_softc::pdev, net80211_device::priv, ath_softc::sc_ah, ath_softc::sc_flags, SC_OP_INVALID, u16, u32, u8, and val.

◆ ath_pci_remove()

void ath_pci_remove ( struct pci_device * pdev)
static

Definition at line 191 of file ath9k.c.

192{
193 struct net80211_device *dev = pci_get_drvdata(pdev);
194 struct ath_softc *sc = dev->priv;
195 void *mem = sc->mem;
196
200 net80211_free(sc->dev);
201
202 iounmap(mem);
203}
int is_ath9k_unloaded
Definition ath9k_init.c:30
void ath9k_deinit_device(struct ath_softc *sc)
Definition ath9k_init.c:578
#define AH_UNPLUGGED
Definition hw.h:655
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition pci.h:376
u32 ah_flags
Definition hw.h:688

References ath_hw::ah_flags, AH_UNPLUGGED, ath9k_deinit_device(), ath_softc::dev, iounmap(), is_ath9k_unloaded, ath_softc::mem, net80211_free(), pci_get_drvdata(), net80211_device::priv, and ath_softc::sc_ah.

Variable Documentation

◆ ath_pci_id_table

struct pci_device_id ath_pci_id_table[]
static
Initial value:
= {
PCI_ROM(0x168c, 0x0023, "ar5416", "Atheros 5416 PCI", 0),
PCI_ROM(0x168c, 0x0024, "ar5416", "Atheros 5416 PCI-E", 0),
PCI_ROM(0x168c, 0x0027, "ar9160", "Atheros 9160 PCI", 0),
PCI_ROM(0x168c, 0x0029, "ar9280", "Atheros 9280 PCI", 0),
PCI_ROM(0x168c, 0x002A, "ar9280", "Atheros 9280 PCI-E", 0),
PCI_ROM(0x168c, 0x002B, "ar9285", "Atheros 9285 PCI-E", 0),
PCI_ROM(0x168c, 0x002C, "ar2427", "Atheros 2427 PCI-E", 0),
PCI_ROM(0x168c, 0x002D, "ar9287", "Atheros 9287 PCI", 0),
PCI_ROM(0x168c, 0x002E, "ar9287", "Atheros 9287 PCI-E", 0),
PCI_ROM(0x168c, 0x0030, "ar9300", "Atheros 9300 PCI-E", 0),
PCI_ROM(0x168c, 0x0032, "ar9485", "Atheros 9485 PCI-E", 0),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition pci.h:308

Definition at line 26 of file ath9k.c.

26 {
27 PCI_ROM(0x168c, 0x0023, "ar5416", "Atheros 5416 PCI", 0), /* PCI */
28 PCI_ROM(0x168c, 0x0024, "ar5416", "Atheros 5416 PCI-E", 0), /* PCI-E */
29 PCI_ROM(0x168c, 0x0027, "ar9160", "Atheros 9160 PCI", 0), /* PCI */
30 PCI_ROM(0x168c, 0x0029, "ar9280", "Atheros 9280 PCI", 0), /* PCI */
31 PCI_ROM(0x168c, 0x002A, "ar9280", "Atheros 9280 PCI-E", 0), /* PCI-E */
32 PCI_ROM(0x168c, 0x002B, "ar9285", "Atheros 9285 PCI-E", 0), /* PCI-E */
33 PCI_ROM(0x168c, 0x002C, "ar2427", "Atheros 2427 PCI-E", 0), /* PCI-E 802.11n bonded out */
34 PCI_ROM(0x168c, 0x002D, "ar9287", "Atheros 9287 PCI", 0), /* PCI */
35 PCI_ROM(0x168c, 0x002E, "ar9287", "Atheros 9287 PCI-E", 0), /* PCI-E */
36 PCI_ROM(0x168c, 0x0030, "ar9300", "Atheros 9300 PCI-E", 0), /* PCI-E AR9300 */
37 PCI_ROM(0x168c, 0x0032, "ar9485", "Atheros 9485 PCI-E", 0), /* PCI-E AR9485 */
38};

◆ ath_pci_bus_ops

const struct ath_bus_ops ath_pci_bus_ops
static
Initial value:
= {
.ath_bus_type = ATH_PCI,
.read_cachesize = ath_pci_read_cachesize,
.eeprom_read = ath_pci_eeprom_read,
.extn_synch_en = ath_pci_extn_synch_enable,
}
static int ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
Definition ath9k.c:60
static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
Definition ath9k.c:42
static void ath_pci_extn_synch_enable(struct ath_common *common)
Definition ath9k.c:81
@ ATH_PCI
Definition ath.h:127

Definition at line 92 of file ath9k.c.

92 {
93 .ath_bus_type = ATH_PCI,
94 .read_cachesize = ath_pci_read_cachesize,
95 .eeprom_read = ath_pci_eeprom_read,
96 .extn_synch_en = ath_pci_extn_synch_enable,
97};

Referenced by ath_pci_probe().

◆ __pci_driver

struct pci_driver ath_pci_driver __pci_driver
Initial value:
= {
.probe = ath_pci_probe,
.remove = ath_pci_remove,
}
static int ath_pci_probe(struct pci_device *pdev)
Definition ath9k.c:99
static struct pci_device_id ath_pci_id_table[]
Definition ath9k.c:26
static void ath_pci_remove(struct pci_device *pdev)
Definition ath9k.c:191
#define ARRAY_SIZE(x)
Definition efx_common.h:43

Definition at line 205 of file ath9k.c.

205 {
206 .id_count = ARRAY_SIZE(ath_pci_id_table),
207 .ids = ath_pci_id_table,
208 .probe = ath_pci_probe,
209 .remove = ath_pci_remove,
210};