3 * Linux device driver for RTL8180 / RTL8185
5 * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
6 * Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
8 * Modified for gPXE, June 2009, by Joshua Oreman <oremanj@rwcr.net>
10 * Based on the r8180 driver, which is:
11 * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
13 * Thanks to Realtek for their support!
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License version 2 as
17 * published by the Free Software Foundation.
20 FILE_LICENCE(GPL2_ONLY
);
27 #include <gpxe/iobuf.h>
28 #include <gpxe/malloc.h>
30 #include <gpxe/net80211.h>
31 #include <gpxe/netdevice.h>
32 #include <gpxe/threewire.h>
36 /* rtl818x_rates[hw rate number] = rate in 100kbps units */
37 static const u16 rtl818x_rates
[] = {
38 10, 20, 55, 110, /* 802.11b */
39 60, 90, 120, 180, 240, 360, 480, 540, /* 802.11g */
40 0, 0, 0, 0, /* index safely using a value masked with 0xF */
42 #define RTL818X_NR_B_RATES 4
43 #define RTL818X_NR_RATES 12
45 /* used by RF drivers */
46 void rtl818x_write_phy(struct net80211_device
*dev
, u8 addr
, u32 data
)
48 struct rtl818x_priv
*priv
= dev
->priv
;
52 buf
= (data
<< 8) | addr
;
54 rtl818x_iowrite32(priv
, (u32
*)&priv
->map
->PHY
[0], buf
| 0x80);
56 rtl818x_iowrite32(priv
, (u32
*)&priv
->map
->PHY
[0], buf
);
57 if (rtl818x_ioread8(priv
, &priv
->map
->PHY
[2]) == (data
& 0xFF))
62 static void rtl818x_handle_rx(struct net80211_device
*dev
)
64 struct rtl818x_priv
*priv
= dev
->priv
;
65 unsigned int count
= RTL818X_RX_RING_SIZE
;
68 struct rtl818x_rx_desc
*entry
= &priv
->rx_ring
[priv
->rx_idx
];
69 struct io_buffer
*iob
= priv
->rx_buf
[priv
->rx_idx
];
70 u32 flags
= le32_to_cpu(entry
->flags
);
72 if (flags
& RTL818X_RX_DESC_FLAG_OWN
)
75 if (flags
& (RTL818X_RX_DESC_FLAG_DMA_FAIL
|
76 RTL818X_RX_DESC_FLAG_FOF
|
77 RTL818X_RX_DESC_FLAG_RX_ERR
)) {
78 /* This is crappy hardware. The Linux driver
79 doesn't even log these. */
81 } else if (flags
& RTL818X_RX_DESC_FLAG_CRC32_ERR
) {
82 /* This is actually a corrupt packet. */
83 DBG2("rtl818x RX:%d CRC fail: flags %08x\n",
85 net80211_rx_err(dev
, NULL
, EIO
);
87 u32 flags2
= le32_to_cpu(entry
->flags2
);
88 struct io_buffer
*new_iob
= alloc_iob(MAX_RX_SIZE
);
90 net80211_rx_err(dev
, NULL
, ENOMEM
);
94 DBGP("rtl818x RX:%d success: flags %08x %08x\n",
95 priv
->rx_idx
, flags
, flags2
);
97 iob_put(iob
, flags
& 0xFFF);
99 net80211_rx(dev
, iob
, (flags2
>> 8) & 0x7f,
100 rtl818x_rates
[(flags
>> 20) & 0xf]);
103 priv
->rx_buf
[priv
->rx_idx
] = iob
;
107 entry
->rx_buf
= cpu_to_le32(virt_to_bus(iob
->data
));
108 entry
->flags
= cpu_to_le32(RTL818X_RX_DESC_FLAG_OWN
| MAX_RX_SIZE
);
110 if (priv
->rx_idx
== RTL818X_RX_RING_SIZE
- 1)
111 entry
->flags
|= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR
);
113 priv
->rx_idx
= (priv
->rx_idx
+ 1) % RTL818X_RX_RING_SIZE
;
117 static void rtl818x_handle_tx(struct net80211_device
*dev
)
119 struct rtl818x_priv
*priv
= dev
->priv
;
120 unsigned int count
= RTL818X_TX_RING_SIZE
;
123 struct rtl818x_tx_desc
*entry
= &priv
->tx_ring
[priv
->tx_cons
];
124 struct io_buffer
*iob
= priv
->tx_buf
[priv
->tx_cons
];
125 u32 flags
= le32_to_cpu(entry
->flags
);
128 if ((flags
& RTL818X_TX_DESC_FLAG_OWN
) || !iob
)
132 if (!(flags
& RTL818X_TX_DESC_FLAG_TX_OK
)) {
133 /* our packet was not ACKed properly */
137 net80211_tx_complete(dev
, iob
, flags
& 0xFF, rc
);
139 priv
->tx_buf
[priv
->tx_cons
] = NULL
;
140 priv
->tx_cons
= (priv
->tx_cons
+ 1) % RTL818X_TX_RING_SIZE
;
144 static void rtl818x_poll(struct net80211_device
*dev
)
146 struct rtl818x_priv
*priv
= dev
->priv
;
147 u16 reg
= rtl818x_ioread16(priv
, &priv
->map
->INT_STATUS
);
152 rtl818x_iowrite16(priv
, &priv
->map
->INT_STATUS
, reg
);
154 if (reg
& (RTL818X_INT_TXN_OK
| RTL818X_INT_TXN_ERR
))
155 rtl818x_handle_tx(dev
);
157 if (reg
& (RTL818X_INT_RX_OK
| RTL818X_INT_RX_ERR
))
158 rtl818x_handle_rx(dev
);
161 #define DIV_ROUND_UP(n,d) (((n)+(d)-1)/(d))
163 static int rtl818x_tx(struct net80211_device
*dev
, struct io_buffer
*iob
)
165 struct rtl818x_priv
*priv
= dev
->priv
;
166 struct rtl818x_tx_desc
*entry
;
169 int len
= iob_len(iob
);
171 tx_flags
= RTL818X_TX_DESC_FLAG_OWN
| RTL818X_TX_DESC_FLAG_FS
|
172 RTL818X_TX_DESC_FLAG_LS
| (priv
->hw_rate
<< 24) | len
;
175 tx_flags
|= RTL818X_TX_DESC_FLAG_DMA
|
176 RTL818X_TX_DESC_FLAG_NO_ENC
;
178 unsigned int remainder
;
180 plcp_len
= DIV_ROUND_UP(16 * (len
+ 4),
181 (dev
->rates
[dev
->rate
] * 2) / 10);
182 remainder
= (16 * (len
+ 4)) %
183 ((dev
->rates
[dev
->rate
] * 2) / 10);
185 if (remainder
> 0 && remainder
<= 6)
189 entry
= &priv
->tx_ring
[priv
->tx_prod
];
191 if (dev
->phy_flags
& NET80211_PHY_USE_PROTECTION
) {
192 tx_flags
|= RTL818X_TX_DESC_FLAG_CTS
;
193 tx_flags
|= priv
->hw_rtscts_rate
<< 19;
194 entry
->rts_duration
= net80211_cts_duration(dev
, len
);
196 entry
->rts_duration
= 0;
199 if (entry
->flags
& RTL818X_TX_DESC_FLAG_OWN
) {
200 /* card hasn't processed the old packet yet! */
204 priv
->tx_buf
[priv
->tx_prod
] = iob
;
205 priv
->tx_prod
= (priv
->tx_prod
+ 1) % RTL818X_TX_RING_SIZE
;
207 entry
->plcp_len
= cpu_to_le16(plcp_len
);
208 entry
->tx_buf
= cpu_to_le32(virt_to_bus(iob
->data
));
209 entry
->frame_len
= cpu_to_le32(len
);
210 entry
->flags2
= /* alternate retry rate in 100kbps << 4 */ 0;
211 entry
->retry_limit
= RTL818X_MAX_RETRIES
;
212 entry
->flags
= cpu_to_le32(tx_flags
);
214 rtl818x_iowrite8(priv
, &priv
->map
->TX_DMA_POLLING
, (1 << 5));
219 void rtl818x_set_anaparam(struct rtl818x_priv
*priv
, u32 anaparam
)
223 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_CONFIG
);
224 reg
= rtl818x_ioread8(priv
, &priv
->map
->CONFIG3
);
225 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG3
,
226 reg
| RTL818X_CONFIG3_ANAPARAM_WRITE
);
227 rtl818x_iowrite32(priv
, &priv
->map
->ANAPARAM
, anaparam
);
228 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG3
,
229 reg
& ~RTL818X_CONFIG3_ANAPARAM_WRITE
);
230 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_NORMAL
);
233 static int rtl818x_init_hw(struct net80211_device
*dev
)
235 struct rtl818x_priv
*priv
= dev
->priv
;
238 rtl818x_iowrite8(priv
, &priv
->map
->CMD
, 0);
239 rtl818x_ioread8(priv
, &priv
->map
->CMD
);
243 rtl818x_iowrite16(priv
, &priv
->map
->INT_MASK
, 0);
244 rtl818x_ioread8(priv
, &priv
->map
->CMD
);
246 reg
= rtl818x_ioread8(priv
, &priv
->map
->CMD
);
248 reg
|= RTL818X_CMD_RESET
;
249 rtl818x_iowrite8(priv
, &priv
->map
->CMD
, RTL818X_CMD_RESET
);
250 rtl818x_ioread8(priv
, &priv
->map
->CMD
);
253 /* check success of reset */
254 if (rtl818x_ioread8(priv
, &priv
->map
->CMD
) & RTL818X_CMD_RESET
) {
255 DBG("rtl818x %s: reset timeout!\n", dev
->netdev
->name
);
259 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_LOAD
);
260 rtl818x_ioread8(priv
, &priv
->map
->CMD
);
263 if (rtl818x_ioread8(priv
, &priv
->map
->CONFIG3
) & (1 << 3)) {
265 reg
= rtl818x_ioread8(priv
, &priv
->map
->CONFIG3
);
267 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG3
, reg
);
268 reg
= rtl818x_ioread16(priv
, &priv
->map
->FEMR
);
269 reg
|= (1 << 15) | (1 << 14) | (1 << 4);
270 rtl818x_iowrite16(priv
, &priv
->map
->FEMR
, reg
);
273 rtl818x_iowrite8(priv
, &priv
->map
->MSR
, 0);
276 rtl818x_set_anaparam(priv
, priv
->anaparam
);
278 rtl818x_iowrite32(priv
, &priv
->map
->RDSAR
, priv
->rx_ring_dma
);
279 rtl818x_iowrite32(priv
, &priv
->map
->TNPDA
, priv
->tx_ring_dma
);
281 /* TODO: necessary? specs indicate not */
282 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_CONFIG
);
283 reg
= rtl818x_ioread8(priv
, &priv
->map
->CONFIG2
);
284 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG2
, reg
& ~(1 << 3));
286 reg
= rtl818x_ioread8(priv
, &priv
->map
->CONFIG2
);
287 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG2
, reg
| (1 << 4));
289 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_NORMAL
);
291 /* TODO: set CONFIG5 for calibrating AGC on rtl8180 + philips radio? */
293 /* TODO: turn off hw wep on rtl8180 */
295 rtl818x_iowrite32(priv
, &priv
->map
->INT_TIMEOUT
, 0);
298 rtl818x_iowrite8(priv
, &priv
->map
->WPA_CONF
, 0);
299 rtl818x_iowrite8(priv
, &priv
->map
->RATE_FALLBACK
, 0x81);
300 rtl818x_iowrite8(priv
, &priv
->map
->RESP_RATE
, (8 << 4) | 0);
302 rtl818x_iowrite16(priv
, &priv
->map
->BRSR
, 0x01F3);
304 /* TODO: set ClkRun enable? necessary? */
305 reg
= rtl818x_ioread8(priv
, &priv
->map
->GP_ENABLE
);
306 rtl818x_iowrite8(priv
, &priv
->map
->GP_ENABLE
, reg
& ~(1 << 6));
307 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_CONFIG
);
308 reg
= rtl818x_ioread8(priv
, &priv
->map
->CONFIG3
);
309 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG3
, reg
| (1 << 2));
310 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_NORMAL
);
312 rtl818x_iowrite16(priv
, &priv
->map
->BRSR
, 0x1);
313 rtl818x_iowrite8(priv
, &priv
->map
->SECURITY
, 0);
315 rtl818x_iowrite8(priv
, &priv
->map
->PHY_DELAY
, 0x6);
316 rtl818x_iowrite8(priv
, &priv
->map
->CARRIER_SENSE_COUNTER
, 0x4C);
321 rtl818x_iowrite16(priv
, &priv
->map
->BRSR
, 0x01F3);
325 static int rtl818x_init_rx_ring(struct net80211_device
*dev
)
327 struct rtl818x_priv
*priv
= dev
->priv
;
328 struct rtl818x_rx_desc
*entry
;
331 priv
->rx_ring
= malloc_dma(sizeof(*priv
->rx_ring
) * RTL818X_RX_RING_SIZE
,
333 priv
->rx_ring_dma
= virt_to_bus(priv
->rx_ring
);
334 if (!priv
->rx_ring
) {
335 DBG("rtl818x %s: cannot allocate RX ring\n", dev
->netdev
->name
);
339 memset(priv
->rx_ring
, 0, sizeof(*priv
->rx_ring
) * RTL818X_RX_RING_SIZE
);
342 for (i
= 0; i
< RTL818X_RX_RING_SIZE
; i
++) {
343 struct io_buffer
*iob
= alloc_iob(MAX_RX_SIZE
);
344 entry
= &priv
->rx_ring
[i
];
348 priv
->rx_buf
[i
] = iob
;
349 entry
->rx_buf
= cpu_to_le32(virt_to_bus(iob
->data
));
350 entry
->flags
= cpu_to_le32(RTL818X_RX_DESC_FLAG_OWN
|
353 entry
->flags
|= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR
);
357 static void rtl818x_free_rx_ring(struct net80211_device
*dev
)
359 struct rtl818x_priv
*priv
= dev
->priv
;
362 for (i
= 0; i
< RTL818X_RX_RING_SIZE
; i
++) {
363 free_iob(priv
->rx_buf
[i
]);
364 priv
->rx_buf
[i
] = NULL
;
367 free_dma(priv
->rx_ring
, sizeof(*priv
->rx_ring
) * RTL818X_RX_RING_SIZE
);
368 priv
->rx_ring
= NULL
;
371 static int rtl818x_init_tx_ring(struct net80211_device
*dev
)
373 struct rtl818x_priv
*priv
= dev
->priv
;
376 priv
->tx_ring
= malloc_dma(sizeof(*priv
->tx_ring
) * RTL818X_TX_RING_SIZE
,
378 priv
->tx_ring_dma
= virt_to_bus(priv
->tx_ring
);
379 if (!priv
->tx_ring
) {
380 DBG("rtl818x %s: cannot allocate TX ring\n", dev
->netdev
->name
);
384 memset(priv
->tx_ring
, 0, sizeof(*priv
->tx_ring
) * RTL818X_TX_RING_SIZE
);
385 priv
->tx_prod
= priv
->tx_cons
= 0;
387 for (i
= 0; i
< RTL818X_TX_RING_SIZE
; i
++)
388 priv
->tx_ring
[i
].next_tx_desc
= cpu_to_le32(priv
->tx_ring_dma
+
389 ((i
+ 1) % RTL818X_TX_RING_SIZE
) * sizeof(*priv
->tx_ring
));
394 static void rtl818x_free_tx_ring(struct net80211_device
*dev
)
396 struct rtl818x_priv
*priv
= dev
->priv
;
399 for (i
= 0; i
< RTL818X_TX_RING_SIZE
; i
++) {
401 net80211_tx_complete(dev
, priv
->tx_buf
[i
], 0, ECANCELED
);
402 priv
->tx_buf
[i
] = NULL
;
405 free_dma(priv
->tx_ring
, sizeof(*priv
->tx_ring
) * RTL818X_TX_RING_SIZE
);
406 priv
->tx_ring
= NULL
;
409 static void rtl818x_irq(struct net80211_device
*dev
, int enable
)
411 struct rtl818x_priv
*priv
= dev
->priv
;
412 rtl818x_iowrite16(priv
, &priv
->map
->INT_MASK
, enable
? 0xFFFF : 0);
415 /* Sets the MAC address of the card. */
416 static void rtl818x_set_hwaddr(struct net80211_device
*dev
, u8
*hwaddr
)
418 struct rtl818x_priv
*priv
= dev
->priv
;
419 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_CONFIG
);
420 rtl818x_iowrite32(priv
, (u32
*)&priv
->map
->MAC
[0],
421 le32_to_cpu(*(u32
*)hwaddr
));
422 rtl818x_iowrite16(priv
, (u16
*)&priv
->map
->MAC
[4],
423 le16_to_cpu(*(u16
*)(hwaddr
+ 4)));
424 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_NORMAL
);
427 static int rtl818x_start(struct net80211_device
*dev
)
429 struct rtl818x_priv
*priv
= dev
->priv
;
433 ret
= rtl818x_init_rx_ring(dev
);
437 ret
= rtl818x_init_tx_ring(dev
);
441 ret
= rtl818x_init_hw(dev
);
445 rtl818x_set_hwaddr(dev
, dev
->netdev
->ll_addr
);
447 rtl818x_iowrite32(priv
, &priv
->map
->RDSAR
, priv
->rx_ring_dma
);
448 rtl818x_iowrite32(priv
, &priv
->map
->TNPDA
, priv
->tx_ring_dma
);
450 rtl818x_iowrite16(priv
, &priv
->map
->INT_MASK
, 0);
452 rtl818x_iowrite32(priv
, &priv
->map
->MAR
[0], ~0);
453 rtl818x_iowrite32(priv
, &priv
->map
->MAR
[1], ~0);
455 reg
= RTL818X_RX_CONF_ONLYERLPKT
|
456 RTL818X_RX_CONF_RX_AUTORESETPHY
|
457 RTL818X_RX_CONF_MGMT
|
458 RTL818X_RX_CONF_DATA
|
459 (7 << 8 /* MAX RX DMA */) |
460 RTL818X_RX_CONF_BROADCAST
|
461 RTL818X_RX_CONF_NICMAC
;
464 reg
|= RTL818X_RX_CONF_CSDM1
| RTL818X_RX_CONF_CSDM2
;
466 reg
|= (priv
->rfparam
& RF_PARAM_CARRIERSENSE1
)
467 ? RTL818X_RX_CONF_CSDM1
: 0;
468 reg
|= (priv
->rfparam
& RF_PARAM_CARRIERSENSE2
)
469 ? RTL818X_RX_CONF_CSDM2
: 0;
473 rtl818x_iowrite32(priv
, &priv
->map
->RX_CONF
, reg
);
476 reg
= rtl818x_ioread8(priv
, &priv
->map
->CW_CONF
);
477 reg
&= ~RTL818X_CW_CONF_PERPACKET_CW_SHIFT
;
478 reg
|= RTL818X_CW_CONF_PERPACKET_RETRY_SHIFT
;
479 rtl818x_iowrite8(priv
, &priv
->map
->CW_CONF
, reg
);
481 reg
= rtl818x_ioread8(priv
, &priv
->map
->TX_AGC_CTL
);
482 reg
&= ~RTL818X_TX_AGC_CTL_PERPACKET_GAIN_SHIFT
;
483 reg
&= ~RTL818X_TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT
;
484 reg
|= RTL818X_TX_AGC_CTL_FEEDBACK_ANT
;
485 rtl818x_iowrite8(priv
, &priv
->map
->TX_AGC_CTL
, reg
);
487 /* disable early TX */
488 rtl818x_iowrite8(priv
, (u8
*)priv
->map
+ 0xec, 0x3f);
491 reg
= rtl818x_ioread32(priv
, &priv
->map
->TX_CONF
);
492 reg
|= (6 << 21 /* MAX TX DMA */) |
493 RTL818X_TX_CONF_NO_ICV
;
496 reg
&= ~RTL818X_TX_CONF_PROBE_DTS
;
498 reg
&= ~RTL818X_TX_CONF_HW_SEQNUM
;
500 /* different meaning, same value on both rtl8185 and rtl8180 */
501 reg
&= ~RTL818X_TX_CONF_SAT_HWPLCP
;
503 rtl818x_iowrite32(priv
, &priv
->map
->TX_CONF
, reg
);
505 reg
= rtl818x_ioread8(priv
, &priv
->map
->CMD
);
506 reg
|= RTL818X_CMD_RX_ENABLE
;
507 reg
|= RTL818X_CMD_TX_ENABLE
;
508 rtl818x_iowrite8(priv
, &priv
->map
->CMD
, reg
);
510 DBG("%s rtl818x: started\n", dev
->netdev
->name
);
515 rtl818x_free_rx_ring(dev
);
517 rtl818x_free_tx_ring(dev
);
519 DBG("%s rtl818x: failed to start\n", dev
->netdev
->name
);
524 static void rtl818x_stop(struct net80211_device
*dev
)
526 struct rtl818x_priv
*priv
= dev
->priv
;
531 reg
= rtl818x_ioread8(priv
, &priv
->map
->CMD
);
532 reg
&= ~RTL818X_CMD_TX_ENABLE
;
533 reg
&= ~RTL818X_CMD_RX_ENABLE
;
534 rtl818x_iowrite8(priv
, &priv
->map
->CMD
, reg
);
538 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_CONFIG
);
539 reg
= rtl818x_ioread8(priv
, &priv
->map
->CONFIG4
);
540 rtl818x_iowrite8(priv
, &priv
->map
->CONFIG4
, reg
| RTL818X_CONFIG4_VCOOFF
);
541 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_NORMAL
);
543 rtl818x_free_rx_ring(dev
);
544 rtl818x_free_tx_ring(dev
);
547 static int rtl818x_config(struct net80211_device
*dev
, int changed
)
549 struct rtl818x_priv
*priv
= dev
->priv
;
552 if (changed
& NET80211_CFG_CHANNEL
)
553 priv
->rf
->set_chan(dev
, &dev
->channels
[dev
->channel
]);
555 if (changed
& NET80211_CFG_ASSOC
) {
556 for (i
= 0; i
< ETH_ALEN
; i
++)
557 rtl818x_iowrite8(priv
, &priv
->map
->BSSID
[i
], dev
->bssid
[i
]);
558 rtl818x_iowrite8(priv
, &priv
->map
->MSR
,
559 dev
->state
& NET80211_ASSOCIATED
?
560 RTL818X_MSR_INFRA
: RTL818X_MSR_NO_LINK
);
563 if (changed
& NET80211_CFG_PHY_PARAMS
)
564 priv
->rf
->conf_erp(dev
);
566 if (changed
& NET80211_CFG_RATE
) {
567 /* figure out the hardware rate number for the new
570 for (hw_rate
= 0; hw_rate
< RTL818X_NR_RATES
&&
571 rtl818x_rates
[hw_rate
] != dev
->rates
[dev
->rate
];
574 if (hw_rate
>= RTL818X_NR_RATES
)
577 priv
->hw_rate
= hw_rate
;
579 /* and the RTS/CTS rate */
580 for (hw_rate
= 0; hw_rate
< RTL818X_NR_RATES
&&
581 rtl818x_rates
[hw_rate
] !=
582 dev
->rates
[dev
->rtscts_rate
];
585 if (hw_rate
>= RTL818X_NR_RATES
)
586 hw_rate
= priv
->hw_rate
;
588 priv
->hw_rtscts_rate
= hw_rate
;
594 static const u8 rtl818x_eeprom_bits
[] = {
595 [SPI_BIT_SCLK
] = RTL818X_EEPROM_CMD_CK
,
596 [SPI_BIT_MISO
] = RTL818X_EEPROM_CMD_READ
,
597 [SPI_BIT_MOSI
] = RTL818X_EEPROM_CMD_WRITE
,
598 [SPI_BIT_SS(0)] = RTL818X_EEPROM_CMD_CS
,
601 static int rtl818x_spi_read_bit(struct bit_basher
*basher
, unsigned int bit_id
)
603 struct rtl818x_priv
*priv
= container_of(basher
, struct rtl818x_priv
,
606 u8 reg
= rtl818x_ioread8(priv
, &priv
->map
->EEPROM_CMD
);
607 return reg
& rtl818x_eeprom_bits
[bit_id
];
610 static void rtl818x_spi_write_bit(struct bit_basher
*basher
,
611 unsigned int bit_id
, unsigned long data
)
613 struct rtl818x_priv
*priv
= container_of(basher
, struct rtl818x_priv
,
616 u8 reg
= rtl818x_ioread8(priv
, &priv
->map
->EEPROM_CMD
);
617 u8 mask
= rtl818x_eeprom_bits
[bit_id
];
618 reg
= (reg
& ~mask
) | (data
& mask
);
620 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, reg
);
622 rtl818x_ioread8(priv
, &priv
->map
->EEPROM_CMD
);
626 static struct bit_basher_operations rtl818x_basher_ops
= {
627 .read
= rtl818x_spi_read_bit
,
628 .write
= rtl818x_spi_write_bit
,
632 static const char *rtl818x_rf_names
[] = {
634 "Intersil", "RFMD", /* unsupported 1-2 */
635 "SA2400", "max2820", "GRF5101", /* supported 3-5 */
636 NULL
, NULL
, NULL
, /* no 6-8 */
637 "RTL8225", /* supported 9 */
638 "RTL8255", /* unsupported 10 */
640 #define RTL818X_NR_RF_NAMES 11
643 struct net80211_device_operations rtl818x_operations
= {
644 .open
= rtl818x_start
,
645 .close
= rtl818x_stop
,
646 .transmit
= rtl818x_tx
,
647 .poll
= rtl818x_poll
,
649 .config
= rtl818x_config
,
652 static int rtl818x_probe(struct pci_device
*pdev
,
653 const struct pci_device_id
*id __unused
)
655 struct net80211_device
*dev
;
656 struct rtl818x_priv
*priv
;
657 struct rtl818x_rf_ops
*rf
;
659 const char *chip_name
;
662 struct net80211_hw_info
*hwinfo
;
664 hwinfo
= zalloc(sizeof(*hwinfo
));
666 DBG("rtl818x: hwinfo alloc failed\n");
670 adjust_pci_device(pdev
);
672 dev
= net80211_alloc(sizeof(*priv
));
674 DBG("rtl818x: net80211 alloc failed\n");
680 dev
->netdev
->dev
= &pdev
->dev
;
682 priv
->map
= (struct rtl818x_csr
*)pdev
->ioaddr
;
684 DBG("rtl818x: cannot find device memory\n");
689 reg
= rtl818x_ioread32(priv
, &priv
->map
->TX_CONF
);
690 reg
&= RTL818X_TX_CONF_HWVER_MASK
;
692 case RTL818X_TX_CONF_R8180_ABCD
:
695 case RTL818X_TX_CONF_R8180_F
:
698 case RTL818X_TX_CONF_R8185_ABC
:
701 case RTL818X_TX_CONF_R8185_D
:
705 DBG("rtl818x: Unknown chip! (0x%x)\n", reg
>> 25);
710 priv
->r8185
= reg
& RTL818X_TX_CONF_R8185_ABC
;
712 hwinfo
->bands
= NET80211_BAND_BIT_2GHZ
;
713 hwinfo
->flags
= NET80211_HW_RX_HAS_FCS
;
714 hwinfo
->signal_type
= NET80211_SIGNAL_ARBITRARY
;
715 hwinfo
->signal_max
= 65;
716 hwinfo
->channel_change_time
= 1000;
718 memcpy(hwinfo
->rates
[NET80211_BAND_2GHZ
], rtl818x_rates
,
719 sizeof(*rtl818x_rates
) * RTL818X_NR_RATES
);
722 hwinfo
->modes
= NET80211_MODE_B
| NET80211_MODE_G
;
723 hwinfo
->nr_rates
[NET80211_BAND_2GHZ
] = RTL818X_NR_RATES
;
725 hwinfo
->modes
= NET80211_MODE_B
;
726 hwinfo
->nr_rates
[NET80211_BAND_2GHZ
] = RTL818X_NR_B_RATES
;
729 priv
->spibit
.basher
.op
= &rtl818x_basher_ops
;
730 priv
->spibit
.bus
.mode
= SPI_MODE_THREEWIRE
;
731 init_spi_bit_basher(&priv
->spibit
);
733 DBG2("rtl818x RX_CONF: %08x\n", rtl818x_ioread32(priv
, &priv
->map
->RX_CONF
));
735 if (rtl818x_ioread32(priv
, &priv
->map
->RX_CONF
) & (1 << 6))
736 init_at93c66(&priv
->eeprom
, 16);
738 init_at93c46(&priv
->eeprom
, 16);
739 priv
->eeprom
.bus
= &priv
->spibit
.bus
;
741 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_PROGRAM
);
742 rtl818x_ioread8(priv
, &priv
->map
->EEPROM_CMD
);
745 nvs_read(&priv
->eeprom
.nvs
, 0x06, &eeprom_val
, 2);
746 DBG2("rtl818x eeprom val = %04x\n", eeprom_val
);
750 for_each_table_entry(rf
, RTL818X_RF_DRIVERS
) {
751 if (rf
->id
== eeprom_val
) {
759 if (eeprom_val
< RTL818X_NR_RF_NAMES
&&
760 rtl818x_rf_names
[eeprom_val
] != NULL
)
761 DBG("rtl818x: %s RF frontend not supported!\n",
762 rtl818x_rf_names
[eeprom_val
]);
764 DBG("rtl818x: RF frontend #%d not recognized!\n",
772 nvs_read(&priv
->eeprom
.nvs
, 0x17, &eeprom_val
, 2);
773 priv
->csthreshold
= eeprom_val
>> 8;
775 nvs_read(&priv
->eeprom
.nvs
, 0xD, &priv
->anaparam
, 4);
776 nvs_read(&priv
->eeprom
.nvs
, 0x19, &priv
->rfparam
, 2);
777 priv
->anaparam
= le32_to_cpu(priv
->anaparam
);
778 priv
->rfparam
= le16_to_cpu(priv
->rfparam
);
781 /* read the MAC address */
782 nvs_read(&priv
->eeprom
.nvs
, 0x7, hwinfo
->hwaddr
, 6);
785 for (i
= 0; i
< 14; i
+= 2) {
787 nvs_read(&priv
->eeprom
.nvs
, 0x10 + (i
>> 1), &txpwr
, 2);
788 priv
->txpower
[i
] = txpwr
& 0xFF;
789 priv
->txpower
[i
+ 1] = txpwr
>> 8;
794 for (i
= 0; i
< 14; i
+= 2) {
796 nvs_read(&priv
->eeprom
.nvs
, 0x20 + (i
>> 1), &txpwr
, 2);
797 priv
->txpower
[i
] |= (txpwr
& 0xFF) << 8;
798 priv
->txpower
[i
+ 1] |= txpwr
& 0xFF00;
802 rtl818x_iowrite8(priv
, &priv
->map
->EEPROM_CMD
, RTL818X_EEPROM_CMD_NORMAL
);
804 err
= net80211_register(dev
, &rtl818x_operations
, hwinfo
);
806 DBG("rtl818x: cannot register device\n");
812 DBG("rtl818x: Realtek RTL818%s (RF chip %s) with address %s\n",
813 chip_name
, priv
->rf
->name
, netdev_addr(dev
->netdev
));
818 pci_set_drvdata(pdev
, NULL
);
824 static void rtl818x_remove(struct pci_device
*pdev
)
826 struct net80211_device
*dev
= pci_get_drvdata(pdev
);
831 net80211_unregister(dev
);
835 /* Hide PCI_ROM definitions in here from parserom.pl; the definitions
836 that should be used are in rtl8180.c and rtl8185.c. */
837 #define RTL_ROM PCI_ROM
839 static struct pci_device_id rtl818x_nics
[] = {
840 RTL_ROM(0x10ec, 0x8185, "rtl8185", "Realtek 8185", 0),
841 RTL_ROM(0x1799, 0x700f, "f5d7000", "Belkin F5D7000", 0),
842 RTL_ROM(0x1799, 0x701f, "f5d7010", "Belkin F5D7010", 0),
844 RTL_ROM(0x10ec, 0x8180, "rtl8180", "Realtek 8180", 0),
845 RTL_ROM(0x1799, 0x6001, "f5d6001", "Belkin F5D6001", 0),
846 RTL_ROM(0x1799, 0x6020, "f5d6020", "Belkin F5D6020", 0),
847 RTL_ROM(0x1186, 0x3300, "dwl510", "D-Link DWL-510", 0),
850 struct pci_driver rtl818x_driver __pci_driver
= {
852 .id_count
= sizeof(rtl818x_nics
) / sizeof(rtl818x_nics
[0]),
853 .probe
= rtl818x_probe
,
854 .remove
= rtl818x_remove
,