3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 /* This file implements all the hardware specific functions for the ZD1211
19 * and ZD1211B chips. Support for the ZD1211B was possible after Timothy
20 * Legge sent me a ZD1211B device. Thank you Tim. -- Uli
23 #include <linux/kernel.h>
24 #include <linux/errno.h>
28 #include "zd_ieee80211.h"
33 void zd_chip_init(struct zd_chip *chip,
34 struct net_device *netdev,
35 struct usb_interface *intf)
37 memset(chip, 0, sizeof(*chip));
38 mutex_init(&chip->mutex);
39 zd_usb_init(&chip->usb, netdev, intf);
40 zd_rf_init(&chip->rf);
43 void zd_chip_clear(struct zd_chip *chip)
45 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
46 zd_usb_clear(&chip->usb);
47 zd_rf_clear(&chip->rf);
48 mutex_destroy(&chip->mutex);
49 ZD_MEMCLEAR(chip, sizeof(*chip));
52 static int scnprint_mac_oui(const u8 *addr, char *buffer, size_t size)
54 return scnprintf(buffer, size, "%02x-%02x-%02x",
55 addr[0], addr[1], addr[2]);
58 /* Prints an identifier line, which will support debugging. */
59 static int scnprint_id(struct zd_chip *chip, char *buffer, size_t size)
63 i = scnprintf(buffer, size, "zd1211%s chip ",
64 chip->is_zd1211b ? "b" : "");
65 i += zd_usb_scnprint_id(&chip->usb, buffer+i, size-i);
66 i += scnprintf(buffer+i, size-i, " ");
67 i += scnprint_mac_oui(chip->e2p_mac, buffer+i, size-i);
68 i += scnprintf(buffer+i, size-i, " ");
69 i += zd_rf_scnprint_id(&chip->rf, buffer+i, size-i);
70 i += scnprintf(buffer+i, size-i, " pa%1x %c%c%c%c", chip->pa_type,
71 chip->patch_cck_gain ? 'g' : '-',
72 chip->patch_cr157 ? '7' : '-',
73 chip->patch_6m_band_edge ? '6' : '-',
74 chip->new_phy_layout ? 'N' : '-');
78 static void print_id(struct zd_chip *chip)
82 scnprint_id(chip, buffer, sizeof(buffer));
83 buffer[sizeof(buffer)-1] = 0;
84 dev_info(zd_chip_dev(chip), "%s\n", buffer);
87 /* Read a variable number of 32-bit values. Parameter count is not allowed to
88 * exceed USB_MAX_IOREAD32_COUNT.
90 int zd_ioread32v_locked(struct zd_chip *chip, u32 *values, const zd_addr_t *addr,
95 zd_addr_t *a16 = (zd_addr_t *)NULL;
99 if (count > USB_MAX_IOREAD32_COUNT)
102 /* Allocate a single memory block for values and addresses. */
104 a16 = (zd_addr_t *)kmalloc(count16 * (sizeof(zd_addr_t) + sizeof(u16)),
107 dev_dbg_f(zd_chip_dev(chip),
108 "error ENOMEM in allocation of a16\n");
112 v16 = (u16 *)(a16 + count16);
114 for (i = 0; i < count; i++) {
116 /* We read the high word always first. */
117 a16[j] = zd_inc_word(addr[i]);
121 r = zd_ioread16v_locked(chip, v16, a16, count16);
123 dev_dbg_f(zd_chip_dev(chip),
124 "error: zd_ioread16v_locked. Error number %d\n", r);
128 for (i = 0; i < count; i++) {
130 values[i] = (v16[j] << 16) | v16[j+1];
138 int _zd_iowrite32v_locked(struct zd_chip *chip, const struct zd_ioreq32 *ioreqs,
142 struct zd_ioreq16 *ioreqs16;
143 unsigned int count16;
145 ZD_ASSERT(mutex_is_locked(&chip->mutex));
149 if (count > USB_MAX_IOWRITE32_COUNT)
152 /* Allocate a single memory block for values and addresses. */
154 ioreqs16 = kmalloc(count16 * sizeof(struct zd_ioreq16), GFP_NOFS);
157 dev_dbg_f(zd_chip_dev(chip),
158 "error %d in ioreqs16 allocation\n", r);
162 for (i = 0; i < count; i++) {
164 /* We write the high word always first. */
165 ioreqs16[j].value = ioreqs[i].value >> 16;
166 ioreqs16[j].addr = zd_inc_word(ioreqs[i].addr);
167 ioreqs16[j+1].value = ioreqs[i].value;
168 ioreqs16[j+1].addr = ioreqs[i].addr;
171 r = zd_usb_iowrite16v(&chip->usb, ioreqs16, count16);
174 dev_dbg_f(zd_chip_dev(chip),
175 "error %d in zd_usb_write16v\n", r);
183 int zd_iowrite16a_locked(struct zd_chip *chip,
184 const struct zd_ioreq16 *ioreqs, unsigned int count)
187 unsigned int i, j, t, max;
189 ZD_ASSERT(mutex_is_locked(&chip->mutex));
190 for (i = 0; i < count; i += j + t) {
193 if (max > USB_MAX_IOWRITE16_COUNT)
194 max = USB_MAX_IOWRITE16_COUNT;
195 for (j = 0; j < max; j++) {
196 if (!ioreqs[i+j].addr) {
202 r = zd_usb_iowrite16v(&chip->usb, &ioreqs[i], j);
204 dev_dbg_f(zd_chip_dev(chip),
205 "error zd_usb_iowrite16v. Error number %d\n",
214 /* Writes a variable number of 32 bit registers. The functions will split
215 * that in several USB requests. A split can be forced by inserting an IO
216 * request with an zero address field.
218 int zd_iowrite32a_locked(struct zd_chip *chip,
219 const struct zd_ioreq32 *ioreqs, unsigned int count)
222 unsigned int i, j, t, max;
224 for (i = 0; i < count; i += j + t) {
227 if (max > USB_MAX_IOWRITE32_COUNT)
228 max = USB_MAX_IOWRITE32_COUNT;
229 for (j = 0; j < max; j++) {
230 if (!ioreqs[i+j].addr) {
236 r = _zd_iowrite32v_locked(chip, &ioreqs[i], j);
238 dev_dbg_f(zd_chip_dev(chip),
239 "error _zd_iowrite32v_locked."
240 " Error number %d\n", r);
248 int zd_ioread16(struct zd_chip *chip, zd_addr_t addr, u16 *value)
252 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
253 mutex_lock(&chip->mutex);
254 r = zd_ioread16_locked(chip, value, addr);
255 mutex_unlock(&chip->mutex);
259 int zd_ioread32(struct zd_chip *chip, zd_addr_t addr, u32 *value)
263 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
264 mutex_lock(&chip->mutex);
265 r = zd_ioread32_locked(chip, value, addr);
266 mutex_unlock(&chip->mutex);
270 int zd_iowrite16(struct zd_chip *chip, zd_addr_t addr, u16 value)
274 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
275 mutex_lock(&chip->mutex);
276 r = zd_iowrite16_locked(chip, value, addr);
277 mutex_unlock(&chip->mutex);
281 int zd_iowrite32(struct zd_chip *chip, zd_addr_t addr, u32 value)
285 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
286 mutex_lock(&chip->mutex);
287 r = zd_iowrite32_locked(chip, value, addr);
288 mutex_unlock(&chip->mutex);
292 int zd_ioread32v(struct zd_chip *chip, const zd_addr_t *addresses,
293 u32 *values, unsigned int count)
297 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
298 mutex_lock(&chip->mutex);
299 r = zd_ioread32v_locked(chip, values, addresses, count);
300 mutex_unlock(&chip->mutex);
304 int zd_iowrite32a(struct zd_chip *chip, const struct zd_ioreq32 *ioreqs,
309 ZD_ASSERT(!mutex_is_locked(&chip->mutex));
310 mutex_lock(&chip->mutex);
311 r = zd_iowrite32a_locked(chip, ioreqs, count);
312 mutex_unlock(&chip->mutex);
316 static int read_pod(struct zd_chip *chip, u8 *rf_type)
321 ZD_ASSERT(mutex_is_locked(&chip->mutex));
322 r = zd_ioread32_locked(chip, &value, E2P_POD);
325 dev_dbg_f(zd_chip_dev(chip), "E2P_POD %#010x\n", value);
327 /* FIXME: AL2230 handling (Bit 7 in POD) */
328 *rf_type = value & 0x0f;
329 chip->pa_type = (value >> 16) & 0x0f;
330 chip->patch_cck_gain = (value >> 8) & 0x1;
331 chip->patch_cr157 = (value >> 13) & 0x1;
332 chip->patch_6m_band_edge = (value >> 21) & 0x1;
333 chip->new_phy_layout = (value >> 31) & 0x1;
335 dev_dbg_f(zd_chip_dev(chip),
336 "RF %s %#01x PA type %#01x patch CCK %d patch CR157 %d "
337 "patch 6M %d new PHY %d\n",
338 zd_rf_name(*rf_type), *rf_type,
339 chip->pa_type, chip->patch_cck_gain,
340 chip->patch_cr157, chip->patch_6m_band_edge, chip->new_phy_layout);
345 chip->patch_cck_gain = 0;
346 chip->patch_cr157 = 0;
347 chip->patch_6m_band_edge = 0;
348 chip->new_phy_layout = 0;
352 static int _read_mac_addr(struct zd_chip *chip, u8 *mac_addr,
353 const zd_addr_t *addr)
358 r = zd_ioread32v_locked(chip, parts, (const zd_addr_t *)addr, 2);
360 dev_dbg_f(zd_chip_dev(chip),
361 "error: couldn't read e2p macs. Error number %d\n", r);
365 mac_addr[0] = parts[0];
366 mac_addr[1] = parts[0] >> 8;
367 mac_addr[2] = parts[0] >> 16;
368 mac_addr[3] = parts[0] >> 24;
369 mac_addr[4] = parts[1];
370 mac_addr[5] = parts[1] >> 8;
375 static int read_e2p_mac_addr(struct zd_chip *chip)
377 static const zd_addr_t addr[2] = { E2P_MAC_ADDR_P1, E2P_MAC_ADDR_P2 };
379 ZD_ASSERT(mutex_is_locked(&chip->mutex));
380 return _read_mac_addr(chip, chip->e2p_mac, (const zd_addr_t *)addr);
383 /* MAC address: if custom mac addresses are to to be used CR_MAC_ADDR_P1 and
384 * CR_MAC_ADDR_P2 must be overwritten
386 void zd_get_e2p_mac_addr(struct zd_chip *chip, u8 *mac_addr)
388 mutex_lock(&chip->mutex);
389 memcpy(mac_addr, chip->e2p_mac, ETH_ALEN);
390 mutex_unlock(&chip->mutex);
393 static int read_mac_addr(struct zd_chip *chip, u8 *mac_addr)
395 static const zd_addr_t addr[2] = { CR_MAC_ADDR_P1, CR_MAC_ADDR_P2 };
396 return _read_mac_addr(chip, mac_addr, (const zd_addr_t *)addr);
399 int zd_read_mac_addr(struct zd_chip *chip, u8 *mac_addr)
403 dev_dbg_f(zd_chip_dev(chip), "\n");
404 mutex_lock(&chip->mutex);
405 r = read_mac_addr(chip, mac_addr);
406 mutex_unlock(&chip->mutex);
410 int zd_write_mac_addr(struct zd_chip *chip, const u8 *mac_addr)
413 struct zd_ioreq32 reqs[2] = {
414 [0] = { .addr = CR_MAC_ADDR_P1 },
415 [1] = { .addr = CR_MAC_ADDR_P2 },
418 reqs[0].value = (mac_addr[3] << 24)
419 | (mac_addr[2] << 16)
422 reqs[1].value = (mac_addr[5] << 8)
425 dev_dbg_f(zd_chip_dev(chip),
426 "mac addr " MAC_FMT "\n", MAC_ARG(mac_addr));
428 mutex_lock(&chip->mutex);
429 r = zd_iowrite32a_locked(chip, reqs, ARRAY_SIZE(reqs));
433 read_mac_addr(chip, tmp);
436 mutex_unlock(&chip->mutex);
440 int zd_read_regdomain(struct zd_chip *chip, u8 *regdomain)
445 mutex_lock(&chip->mutex);
446 r = zd_ioread32_locked(chip, &value, E2P_SUBID);
447 mutex_unlock(&chip->mutex);
451 *regdomain = value >> 16;
452 dev_dbg_f(zd_chip_dev(chip), "regdomain: %#04x\n", *regdomain);
457 static int read_values(struct zd_chip *chip, u8 *values, size_t count,
458 zd_addr_t e2p_addr, u32 guard)
464 ZD_ASSERT(mutex_is_locked(&chip->mutex));
466 r = zd_ioread32_locked(chip, &v, e2p_addr+i/2);
472 values[i++] = v >> 8;
473 values[i++] = v >> 16;
474 values[i++] = v >> 24;
477 for (;i < count; i++)
478 values[i] = v >> (8*(i%3));
483 static int read_pwr_cal_values(struct zd_chip *chip)
485 return read_values(chip, chip->pwr_cal_values,
486 E2P_CHANNEL_COUNT, E2P_PWR_CAL_VALUE1,
490 static int read_pwr_int_values(struct zd_chip *chip)
492 return read_values(chip, chip->pwr_int_values,
493 E2P_CHANNEL_COUNT, E2P_PWR_INT_VALUE1,
497 static int read_ofdm_cal_values(struct zd_chip *chip)
501 static const zd_addr_t addresses[] = {
507 for (i = 0; i < 3; i++) {
508 r = read_values(chip, chip->ofdm_cal_values[i],
509 E2P_CHANNEL_COUNT, addresses[i], 0);
516 static int read_cal_int_tables(struct zd_chip *chip)
520 r = read_pwr_cal_values(chip);
523 r = read_pwr_int_values(chip);
526 r = read_ofdm_cal_values(chip);
532 /* phy means physical registers */
533 int zd_chip_lock_phy_regs(struct zd_chip *chip)
538 ZD_ASSERT(mutex_is_locked(&chip->mutex));
539 r = zd_ioread32_locked(chip, &tmp, CR_REG1);
541 dev_err(zd_chip_dev(chip), "error ioread32(CR_REG1): %d\n", r);
545 dev_dbg_f(zd_chip_dev(chip),
546 "CR_REG1: 0x%02x -> 0x%02x\n", tmp, tmp & ~UNLOCK_PHY_REGS);
547 tmp &= ~UNLOCK_PHY_REGS;
549 r = zd_iowrite32_locked(chip, tmp, CR_REG1);
551 dev_err(zd_chip_dev(chip), "error iowrite32(CR_REG1): %d\n", r);
555 int zd_chip_unlock_phy_regs(struct zd_chip *chip)
560 ZD_ASSERT(mutex_is_locked(&chip->mutex));
561 r = zd_ioread32_locked(chip, &tmp, CR_REG1);
563 dev_err(zd_chip_dev(chip),
564 "error ioread32(CR_REG1): %d\n", r);
568 dev_dbg_f(zd_chip_dev(chip),
569 "CR_REG1: 0x%02x -> 0x%02x\n", tmp, tmp | UNLOCK_PHY_REGS);
570 tmp |= UNLOCK_PHY_REGS;
572 r = zd_iowrite32_locked(chip, tmp, CR_REG1);
574 dev_err(zd_chip_dev(chip), "error iowrite32(CR_REG1): %d\n", r);
578 /* CR157 can be optionally patched by the EEPROM */
579 static int patch_cr157(struct zd_chip *chip)
584 if (!chip->patch_cr157)
587 r = zd_ioread32_locked(chip, &value, E2P_PHY_REG);
591 dev_dbg_f(zd_chip_dev(chip), "patching value %x\n", value >> 8);
592 return zd_iowrite32_locked(chip, value >> 8, CR157);
596 * 6M band edge can be optionally overwritten for certain RF's
597 * Vendor driver says: for FCC regulation, enabled per HWFeature 6M band edge
598 * bit (for AL2230, AL2230S)
600 static int patch_6m_band_edge(struct zd_chip *chip, int channel)
602 struct zd_ioreq16 ioreqs[] = {
603 { CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 },
607 if (!chip->patch_6m_band_edge || !chip->rf.patch_6m_band_edge)
610 /* FIXME: Channel 11 is not the edge for all regulatory domains. */
611 if (channel == 1 || channel == 11)
612 ioreqs[0].value = 0x12;
614 dev_dbg_f(zd_chip_dev(chip), "patching for channel %d\n", channel);
615 return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
618 static int zd1211_hw_reset_phy(struct zd_chip *chip)
620 static const struct zd_ioreq16 ioreqs[] = {
621 { CR0, 0x0a }, { CR1, 0x06 }, { CR2, 0x26 },
622 { CR3, 0x38 }, { CR4, 0x80 }, { CR9, 0xa0 },
623 { CR10, 0x81 }, { CR11, 0x00 }, { CR12, 0x7f },
624 { CR13, 0x8c }, { CR14, 0x80 }, { CR15, 0x3d },
625 { CR16, 0x20 }, { CR17, 0x1e }, { CR18, 0x0a },
626 { CR19, 0x48 }, { CR20, 0x0c }, { CR21, 0x0c },
627 { CR22, 0x23 }, { CR23, 0x90 }, { CR24, 0x14 },
628 { CR25, 0x40 }, { CR26, 0x10 }, { CR27, 0x19 },
629 { CR28, 0x7f }, { CR29, 0x80 }, { CR30, 0x4b },
630 { CR31, 0x60 }, { CR32, 0x43 }, { CR33, 0x08 },
631 { CR34, 0x06 }, { CR35, 0x0a }, { CR36, 0x00 },
632 { CR37, 0x00 }, { CR38, 0x38 }, { CR39, 0x0c },
633 { CR40, 0x84 }, { CR41, 0x2a }, { CR42, 0x80 },
634 { CR43, 0x10 }, { CR44, 0x12 }, { CR46, 0xff },
635 { CR47, 0x1E }, { CR48, 0x26 }, { CR49, 0x5b },
636 { CR64, 0xd0 }, { CR65, 0x04 }, { CR66, 0x58 },
637 { CR67, 0xc9 }, { CR68, 0x88 }, { CR69, 0x41 },
638 { CR70, 0x23 }, { CR71, 0x10 }, { CR72, 0xff },
639 { CR73, 0x32 }, { CR74, 0x30 }, { CR75, 0x65 },
640 { CR76, 0x41 }, { CR77, 0x1b }, { CR78, 0x30 },
641 { CR79, 0x68 }, { CR80, 0x64 }, { CR81, 0x64 },
642 { CR82, 0x00 }, { CR83, 0x00 }, { CR84, 0x00 },
643 { CR85, 0x02 }, { CR86, 0x00 }, { CR87, 0x00 },
644 { CR88, 0xff }, { CR89, 0xfc }, { CR90, 0x00 },
645 { CR91, 0x00 }, { CR92, 0x00 }, { CR93, 0x08 },
646 { CR94, 0x00 }, { CR95, 0x00 }, { CR96, 0xff },
647 { CR97, 0xe7 }, { CR98, 0x00 }, { CR99, 0x00 },
648 { CR100, 0x00 }, { CR101, 0xae }, { CR102, 0x02 },
649 { CR103, 0x00 }, { CR104, 0x03 }, { CR105, 0x65 },
650 { CR106, 0x04 }, { CR107, 0x00 }, { CR108, 0x0a },
651 { CR109, 0xaa }, { CR110, 0xaa }, { CR111, 0x25 },
652 { CR112, 0x25 }, { CR113, 0x00 }, { CR119, 0x1e },
653 { CR125, 0x90 }, { CR126, 0x00 }, { CR127, 0x00 },
655 { CR5, 0x00 }, { CR6, 0x00 }, { CR7, 0x00 },
656 { CR8, 0x00 }, { CR9, 0x20 }, { CR12, 0xf0 },
657 { CR20, 0x0e }, { CR21, 0x0e }, { CR27, 0x10 },
658 { CR44, 0x33 }, { CR47, 0x1E }, { CR83, 0x24 },
659 { CR84, 0x04 }, { CR85, 0x00 }, { CR86, 0x0C },
660 { CR87, 0x12 }, { CR88, 0x0C }, { CR89, 0x00 },
661 { CR90, 0x10 }, { CR91, 0x08 }, { CR93, 0x00 },
662 { CR94, 0x01 }, { CR95, 0x00 }, { CR96, 0x50 },
663 { CR97, 0x37 }, { CR98, 0x35 }, { CR101, 0x13 },
664 { CR102, 0x27 }, { CR103, 0x27 }, { CR104, 0x18 },
665 { CR105, 0x12 }, { CR109, 0x27 }, { CR110, 0x27 },
666 { CR111, 0x27 }, { CR112, 0x27 }, { CR113, 0x27 },
667 { CR114, 0x27 }, { CR115, 0x26 }, { CR116, 0x24 },
668 { CR117, 0xfc }, { CR118, 0xfa }, { CR120, 0x4f },
669 { CR123, 0x27 }, { CR125, 0xaa }, { CR127, 0x03 },
670 { CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 },
671 { CR131, 0x0C }, { CR136, 0xdf }, { CR137, 0x40 },
672 { CR138, 0xa0 }, { CR139, 0xb0 }, { CR140, 0x99 },
673 { CR141, 0x82 }, { CR142, 0x54 }, { CR143, 0x1c },
674 { CR144, 0x6c }, { CR147, 0x07 }, { CR148, 0x4c },
675 { CR149, 0x50 }, { CR150, 0x0e }, { CR151, 0x18 },
676 { CR160, 0xfe }, { CR161, 0xee }, { CR162, 0xaa },
677 { CR163, 0xfa }, { CR164, 0xfa }, { CR165, 0xea },
678 { CR166, 0xbe }, { CR167, 0xbe }, { CR168, 0x6a },
679 { CR169, 0xba }, { CR170, 0xba }, { CR171, 0xba },
680 /* Note: CR204 must lead the CR203 */
688 dev_dbg_f(zd_chip_dev(chip), "\n");
690 r = zd_chip_lock_phy_regs(chip);
694 r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
698 r = patch_cr157(chip);
700 t = zd_chip_unlock_phy_regs(chip);
707 static int zd1211b_hw_reset_phy(struct zd_chip *chip)
709 static const struct zd_ioreq16 ioreqs[] = {
710 { CR0, 0x14 }, { CR1, 0x06 }, { CR2, 0x26 },
711 { CR3, 0x38 }, { CR4, 0x80 }, { CR9, 0xe0 },
713 /* power control { { CR11, 1 << 6 }, */
715 { CR12, 0xf0 }, { CR13, 0x8c }, { CR14, 0x80 },
716 { CR15, 0x3d }, { CR16, 0x20 }, { CR17, 0x1e },
717 { CR18, 0x0a }, { CR19, 0x48 },
718 { CR20, 0x10 }, /* Org:0x0E, ComTrend:RalLink AP */
719 { CR21, 0x0e }, { CR22, 0x23 }, { CR23, 0x90 },
720 { CR24, 0x14 }, { CR25, 0x40 }, { CR26, 0x10 },
721 { CR27, 0x10 }, { CR28, 0x7f }, { CR29, 0x80 },
722 { CR30, 0x4b }, /* ASIC/FWT, no jointly decoder */
723 { CR31, 0x60 }, { CR32, 0x43 }, { CR33, 0x08 },
724 { CR34, 0x06 }, { CR35, 0x0a }, { CR36, 0x00 },
725 { CR37, 0x00 }, { CR38, 0x38 }, { CR39, 0x0c },
726 { CR40, 0x84 }, { CR41, 0x2a }, { CR42, 0x80 },
727 { CR43, 0x10 }, { CR44, 0x33 }, { CR46, 0xff },
728 { CR47, 0x1E }, { CR48, 0x26 }, { CR49, 0x5b },
729 { CR64, 0xd0 }, { CR65, 0x04 }, { CR66, 0x58 },
730 { CR67, 0xc9 }, { CR68, 0x88 }, { CR69, 0x41 },
731 { CR70, 0x23 }, { CR71, 0x10 }, { CR72, 0xff },
732 { CR73, 0x32 }, { CR74, 0x30 }, { CR75, 0x65 },
733 { CR76, 0x41 }, { CR77, 0x1b }, { CR78, 0x30 },
734 { CR79, 0xf0 }, { CR80, 0x64 }, { CR81, 0x64 },
735 { CR82, 0x00 }, { CR83, 0x24 }, { CR84, 0x04 },
736 { CR85, 0x00 }, { CR86, 0x0c }, { CR87, 0x12 },
737 { CR88, 0x0c }, { CR89, 0x00 }, { CR90, 0x58 },
738 { CR91, 0x04 }, { CR92, 0x00 }, { CR93, 0x00 },
740 { CR95, 0x20 }, /* ZD1211B */
741 { CR96, 0x50 }, { CR97, 0x37 }, { CR98, 0x35 },
742 { CR99, 0x00 }, { CR100, 0x01 }, { CR101, 0x13 },
743 { CR102, 0x27 }, { CR103, 0x27 }, { CR104, 0x18 },
744 { CR105, 0x12 }, { CR106, 0x04 }, { CR107, 0x00 },
745 { CR108, 0x0a }, { CR109, 0x27 }, { CR110, 0x27 },
746 { CR111, 0x27 }, { CR112, 0x27 }, { CR113, 0x27 },
747 { CR114, 0x27 }, { CR115, 0x26 }, { CR116, 0x24 },
748 { CR117, 0xfc }, { CR118, 0xfa }, { CR119, 0x1e },
749 { CR125, 0x90 }, { CR126, 0x00 }, { CR127, 0x00 },
750 { CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 },
751 { CR131, 0x0c }, { CR136, 0xdf }, { CR137, 0xa0 },
752 { CR138, 0xa8 }, { CR139, 0xb4 }, { CR140, 0x98 },
753 { CR141, 0x82 }, { CR142, 0x53 }, { CR143, 0x1c },
754 { CR144, 0x6c }, { CR147, 0x07 }, { CR148, 0x40 },
755 { CR149, 0x40 }, /* Org:0x50 ComTrend:RalLink AP */
756 { CR150, 0x14 }, /* Org:0x0E ComTrend:RalLink AP */
757 { CR151, 0x18 }, { CR159, 0x70 }, { CR160, 0xfe },
758 { CR161, 0xee }, { CR162, 0xaa }, { CR163, 0xfa },
759 { CR164, 0xfa }, { CR165, 0xea }, { CR166, 0xbe },
760 { CR167, 0xbe }, { CR168, 0x6a }, { CR169, 0xba },
761 { CR170, 0xba }, { CR171, 0xba },
762 /* Note: CR204 must lead the CR203 */
770 dev_dbg_f(zd_chip_dev(chip), "\n");
772 r = zd_chip_lock_phy_regs(chip);
776 r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
780 r = patch_cr157(chip);
782 t = zd_chip_unlock_phy_regs(chip);
789 static int hw_reset_phy(struct zd_chip *chip)
791 return chip->is_zd1211b ? zd1211b_hw_reset_phy(chip) :
792 zd1211_hw_reset_phy(chip);
795 static int zd1211_hw_init_hmac(struct zd_chip *chip)
797 static const struct zd_ioreq32 ioreqs[] = {
798 { CR_ACK_TIMEOUT_EXT, 0x20 },
799 { CR_ADDA_MBIAS_WARMTIME, 0x30000808 },
800 { CR_ZD1211_RETRY_MAX, 0x2 },
801 { CR_SNIFFER_ON, 0 },
802 { CR_RX_FILTER, STA_RX_FILTER },
803 { CR_GROUP_HASH_P1, 0x00 },
804 { CR_GROUP_HASH_P2, 0x80000000 },
806 { CR_ADDA_PWR_DWN, 0x7f },
807 { CR_BCN_PLCP_CFG, 0x00f00401 },
808 { CR_PHY_DELAY, 0x00 },
809 { CR_ACK_TIMEOUT_EXT, 0x80 },
810 { CR_ADDA_PWR_DWN, 0x00 },
811 { CR_ACK_TIME_80211, 0x100 },
812 { CR_RX_PE_DELAY, 0x70 },
813 { CR_PS_CTRL, 0x10000000 },
814 { CR_RTS_CTS_RATE, 0x02030203 },
815 { CR_RX_THRESHOLD, 0x000c0640 },
816 { CR_AFTER_PNP, 0x1 },
817 { CR_WEP_PROTECT, 0x114 },
822 dev_dbg_f(zd_chip_dev(chip), "\n");
823 ZD_ASSERT(mutex_is_locked(&chip->mutex));
824 r = zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
827 dev_err(zd_chip_dev(chip),
828 "error in zd_iowrite32a_locked. Error number %d\n", r);
834 static int zd1211b_hw_init_hmac(struct zd_chip *chip)
836 static const struct zd_ioreq32 ioreqs[] = {
837 { CR_ACK_TIMEOUT_EXT, 0x20 },
838 { CR_ADDA_MBIAS_WARMTIME, 0x30000808 },
839 { CR_ZD1211B_RETRY_MAX, 0x02020202 },
840 { CR_ZD1211B_TX_PWR_CTL4, 0x007f003f },
841 { CR_ZD1211B_TX_PWR_CTL3, 0x007f003f },
842 { CR_ZD1211B_TX_PWR_CTL2, 0x003f001f },
843 { CR_ZD1211B_TX_PWR_CTL1, 0x001f000f },
844 { CR_ZD1211B_AIFS_CTL1, 0x00280028 },
845 { CR_ZD1211B_AIFS_CTL2, 0x008C003C },
846 { CR_ZD1211B_TXOP, 0x01800824 },
847 { CR_SNIFFER_ON, 0 },
848 { CR_RX_FILTER, STA_RX_FILTER },
849 { CR_GROUP_HASH_P1, 0x00 },
850 { CR_GROUP_HASH_P2, 0x80000000 },
852 { CR_ADDA_PWR_DWN, 0x7f },
853 { CR_BCN_PLCP_CFG, 0x00f00401 },
854 { CR_PHY_DELAY, 0x00 },
855 { CR_ACK_TIMEOUT_EXT, 0x80 },
856 { CR_ADDA_PWR_DWN, 0x00 },
857 { CR_ACK_TIME_80211, 0x100 },
858 { CR_RX_PE_DELAY, 0x70 },
859 { CR_PS_CTRL, 0x10000000 },
860 { CR_RTS_CTS_RATE, 0x02030203 },
861 { CR_RX_THRESHOLD, 0x000c0eff, },
862 { CR_AFTER_PNP, 0x1 },
863 { CR_WEP_PROTECT, 0x114 },
868 dev_dbg_f(zd_chip_dev(chip), "\n");
869 ZD_ASSERT(mutex_is_locked(&chip->mutex));
870 r = zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
872 dev_dbg_f(zd_chip_dev(chip),
873 "error in zd_iowrite32a_locked. Error number %d\n", r);
878 static int hw_init_hmac(struct zd_chip *chip)
880 return chip->is_zd1211b ?
881 zd1211b_hw_init_hmac(chip) : zd1211_hw_init_hmac(chip);
890 static int get_aw_pt_bi(struct zd_chip *chip, struct aw_pt_bi *s)
893 static const zd_addr_t aw_pt_bi_addr[] =
894 { CR_ATIM_WND_PERIOD, CR_PRE_TBTT, CR_BCN_INTERVAL };
897 r = zd_ioread32v_locked(chip, values, (const zd_addr_t *)aw_pt_bi_addr,
898 ARRAY_SIZE(aw_pt_bi_addr));
900 memset(s, 0, sizeof(*s));
904 s->atim_wnd_period = values[0];
905 s->pre_tbtt = values[1];
906 s->beacon_interval = values[2];
907 dev_dbg_f(zd_chip_dev(chip), "aw %u pt %u bi %u\n",
908 s->atim_wnd_period, s->pre_tbtt, s->beacon_interval);
912 static int set_aw_pt_bi(struct zd_chip *chip, struct aw_pt_bi *s)
914 struct zd_ioreq32 reqs[3];
916 if (s->beacon_interval <= 5)
917 s->beacon_interval = 5;
918 if (s->pre_tbtt < 4 || s->pre_tbtt >= s->beacon_interval)
919 s->pre_tbtt = s->beacon_interval - 1;
920 if (s->atim_wnd_period >= s->pre_tbtt)
921 s->atim_wnd_period = s->pre_tbtt - 1;
923 reqs[0].addr = CR_ATIM_WND_PERIOD;
924 reqs[0].value = s->atim_wnd_period;
925 reqs[1].addr = CR_PRE_TBTT;
926 reqs[1].value = s->pre_tbtt;
927 reqs[2].addr = CR_BCN_INTERVAL;
928 reqs[2].value = s->beacon_interval;
930 dev_dbg_f(zd_chip_dev(chip),
931 "aw %u pt %u bi %u\n", s->atim_wnd_period, s->pre_tbtt,
933 return zd_iowrite32a_locked(chip, reqs, ARRAY_SIZE(reqs));
937 static int set_beacon_interval(struct zd_chip *chip, u32 interval)
942 ZD_ASSERT(mutex_is_locked(&chip->mutex));
943 r = get_aw_pt_bi(chip, &s);
946 s.beacon_interval = interval;
947 return set_aw_pt_bi(chip, &s);
950 int zd_set_beacon_interval(struct zd_chip *chip, u32 interval)
954 mutex_lock(&chip->mutex);
955 r = set_beacon_interval(chip, interval);
956 mutex_unlock(&chip->mutex);
960 static int hw_init(struct zd_chip *chip)
964 dev_dbg_f(zd_chip_dev(chip), "\n");
965 ZD_ASSERT(mutex_is_locked(&chip->mutex));
966 r = hw_reset_phy(chip);
970 r = hw_init_hmac(chip);
974 /* Although the vendor driver defaults to a different value during
975 * init, it overwrites the IFS value with the following every time
976 * the channel changes. We should aim to be more intelligent... */
977 r = zd_iowrite32_locked(chip, IFS_VALUE_DEFAULT, CR_IFS_VALUE);
981 return set_beacon_interval(chip, 100);
985 static int dump_cr(struct zd_chip *chip, const zd_addr_t addr,
986 const char *addr_string)
991 r = zd_ioread32_locked(chip, &value, addr);
993 dev_dbg_f(zd_chip_dev(chip),
994 "error reading %s. Error number %d\n", addr_string, r);
998 dev_dbg_f(zd_chip_dev(chip), "%s %#010x\n",
999 addr_string, (unsigned int)value);
1003 static int test_init(struct zd_chip *chip)
1007 r = dump_cr(chip, CR_AFTER_PNP, "CR_AFTER_PNP");
1010 r = dump_cr(chip, CR_GPI_EN, "CR_GPI_EN");
1013 return dump_cr(chip, CR_INTERRUPT, "CR_INTERRUPT");
1016 static void dump_fw_registers(struct zd_chip *chip)
1018 static const zd_addr_t addr[4] = {
1019 FW_FIRMWARE_VER, FW_USB_SPEED, FW_FIX_TX_RATE,
1026 r = zd_ioread16v_locked(chip, values, (const zd_addr_t*)addr,
1029 dev_dbg_f(zd_chip_dev(chip), "error %d zd_ioread16v_locked\n",
1034 dev_dbg_f(zd_chip_dev(chip), "FW_FIRMWARE_VER %#06hx\n", values[0]);
1035 dev_dbg_f(zd_chip_dev(chip), "FW_USB_SPEED %#06hx\n", values[1]);
1036 dev_dbg_f(zd_chip_dev(chip), "FW_FIX_TX_RATE %#06hx\n", values[2]);
1037 dev_dbg_f(zd_chip_dev(chip), "FW_LINK_STATUS %#06hx\n", values[3]);
1041 static int print_fw_version(struct zd_chip *chip)
1046 r = zd_ioread16_locked(chip, &version, FW_FIRMWARE_VER);
1050 dev_info(zd_chip_dev(chip),"firmware version %04hx\n", version);
1054 static int set_mandatory_rates(struct zd_chip *chip, enum ieee80211_std std)
1057 ZD_ASSERT(mutex_is_locked(&chip->mutex));
1058 /* This sets the mandatory rates, which only depend from the standard
1059 * that the device is supporting. Until further notice we should try
1060 * to support 802.11g also for full speed USB.
1064 rates = CR_RATE_1M|CR_RATE_2M|CR_RATE_5_5M|CR_RATE_11M;
1067 rates = CR_RATE_1M|CR_RATE_2M|CR_RATE_5_5M|CR_RATE_11M|
1068 CR_RATE_6M|CR_RATE_12M|CR_RATE_24M;
1073 return zd_iowrite32_locked(chip, rates, CR_MANDATORY_RATE_TBL);
1076 int zd_chip_enable_hwint(struct zd_chip *chip)
1080 mutex_lock(&chip->mutex);
1081 r = zd_iowrite32_locked(chip, HWINT_ENABLED, CR_INTERRUPT);
1082 mutex_unlock(&chip->mutex);
1086 static int disable_hwint(struct zd_chip *chip)
1088 return zd_iowrite32_locked(chip, HWINT_DISABLED, CR_INTERRUPT);
1091 int zd_chip_disable_hwint(struct zd_chip *chip)
1095 mutex_lock(&chip->mutex);
1096 r = disable_hwint(chip);
1097 mutex_unlock(&chip->mutex);
1101 int zd_chip_init_hw(struct zd_chip *chip, u8 device_type)
1106 dev_dbg_f(zd_chip_dev(chip), "\n");
1108 mutex_lock(&chip->mutex);
1109 chip->is_zd1211b = (device_type == DEVICE_ZD1211B) != 0;
1112 r = test_init(chip);
1116 r = zd_iowrite32_locked(chip, 1, CR_AFTER_PNP);
1120 r = zd_usb_init_hw(&chip->usb);
1124 /* GPI is always disabled, also in the other driver.
1126 r = zd_iowrite32_locked(chip, 0, CR_GPI_EN);
1129 r = zd_iowrite32_locked(chip, CWIN_SIZE, CR_CWMIN_CWMAX);
1132 /* Currently we support IEEE 802.11g for full and high speed USB.
1133 * It might be discussed, whether we should suppport pure b mode for
1136 r = set_mandatory_rates(chip, IEEE80211G);
1139 /* Disabling interrupts is certainly a smart thing here.
1141 r = disable_hwint(chip);
1144 r = read_pod(chip, &rf_type);
1150 r = zd_rf_init_hw(&chip->rf, rf_type);
1154 r = print_fw_version(chip);
1159 dump_fw_registers(chip);
1160 r = test_init(chip);
1165 r = read_e2p_mac_addr(chip);
1169 r = read_cal_int_tables(chip);
1175 mutex_unlock(&chip->mutex);
1179 static int update_pwr_int(struct zd_chip *chip, u8 channel)
1181 u8 value = chip->pwr_int_values[channel - 1];
1182 dev_dbg_f(zd_chip_dev(chip), "channel %d pwr_int %#04x\n",
1184 return zd_iowrite32_locked(chip, value, CR31);
1187 static int update_pwr_cal(struct zd_chip *chip, u8 channel)
1189 u8 value = chip->pwr_cal_values[channel-1];
1190 dev_dbg_f(zd_chip_dev(chip), "channel %d pwr_cal %#04x\n",
1192 return zd_iowrite32_locked(chip, value, CR68);
1195 static int update_ofdm_cal(struct zd_chip *chip, u8 channel)
1197 struct zd_ioreq32 ioreqs[3];
1199 ioreqs[0].addr = CR67;
1200 ioreqs[0].value = chip->ofdm_cal_values[OFDM_36M_INDEX][channel-1];
1201 ioreqs[1].addr = CR66;
1202 ioreqs[1].value = chip->ofdm_cal_values[OFDM_48M_INDEX][channel-1];
1203 ioreqs[2].addr = CR65;
1204 ioreqs[2].value = chip->ofdm_cal_values[OFDM_54M_INDEX][channel-1];
1206 dev_dbg_f(zd_chip_dev(chip),
1207 "channel %d ofdm_cal 36M %#04x 48M %#04x 54M %#04x\n",
1208 channel, ioreqs[0].value, ioreqs[1].value, ioreqs[2].value);
1209 return zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
1212 static int update_channel_integration_and_calibration(struct zd_chip *chip,
1217 r = update_pwr_int(chip, channel);
1220 if (chip->is_zd1211b) {
1221 static const struct zd_ioreq32 ioreqs[] = {
1227 r = update_ofdm_cal(chip, channel);
1230 r = update_pwr_cal(chip, channel);
1233 r = zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
1241 /* The CCK baseband gain can be optionally patched by the EEPROM */
1242 static int patch_cck_gain(struct zd_chip *chip)
1247 if (!chip->patch_cck_gain)
1250 ZD_ASSERT(mutex_is_locked(&chip->mutex));
1251 r = zd_ioread32_locked(chip, &value, E2P_PHY_REG);
1254 dev_dbg_f(zd_chip_dev(chip), "patching value %x\n", value & 0xff);
1255 return zd_iowrite32_locked(chip, value & 0xff, CR47);
1258 int zd_chip_set_channel(struct zd_chip *chip, u8 channel)
1262 mutex_lock(&chip->mutex);
1263 r = zd_chip_lock_phy_regs(chip);
1266 r = zd_rf_set_channel(&chip->rf, channel);
1269 r = update_channel_integration_and_calibration(chip, channel);
1272 r = patch_cck_gain(chip);
1275 r = patch_6m_band_edge(chip, channel);
1278 r = zd_iowrite32_locked(chip, 0, CR_CONFIG_PHILIPS);
1280 t = zd_chip_unlock_phy_regs(chip);
1284 mutex_unlock(&chip->mutex);
1288 u8 zd_chip_get_channel(struct zd_chip *chip)
1292 mutex_lock(&chip->mutex);
1293 channel = chip->rf.channel;
1294 mutex_unlock(&chip->mutex);
1298 static u16 led_mask(int led)
1310 static int read_led_reg(struct zd_chip *chip, u16 *status)
1312 ZD_ASSERT(mutex_is_locked(&chip->mutex));
1313 return zd_ioread16_locked(chip, status, CR_LED);
1316 static int write_led_reg(struct zd_chip *chip, u16 status)
1318 ZD_ASSERT(mutex_is_locked(&chip->mutex));
1319 return zd_iowrite16_locked(chip, status, CR_LED);
1322 int zd_chip_led_status(struct zd_chip *chip, int led, enum led_status status)
1325 u16 mask = led_mask(led);
1330 mutex_lock(&chip->mutex);
1331 r = read_led_reg(chip, ®);
1336 return (reg & mask) ? LED_ON : LED_OFF;
1343 ret = (reg&mask) ? LED_ON : LED_OFF;
1352 r = write_led_reg(chip, reg);
1358 mutex_unlock(&chip->mutex);
1362 int zd_chip_led_flip(struct zd_chip *chip, int led,
1363 const unsigned int *phases_msecs, unsigned int count)
1366 enum led_status status;
1368 r = zd_chip_led_status(chip, led, LED_STATUS);
1372 for (i = 0; i < count; i++) {
1373 r = zd_chip_led_status(chip, led, LED_FLIP);
1376 msleep(phases_msecs[i]);
1380 zd_chip_led_status(chip, led, status);
1384 int zd_chip_set_basic_rates(struct zd_chip *chip, u16 cr_rates)
1388 if (cr_rates & ~(CR_RATES_80211B|CR_RATES_80211G))
1391 mutex_lock(&chip->mutex);
1392 r = zd_iowrite32_locked(chip, cr_rates, CR_BASIC_RATE_TBL);
1393 mutex_unlock(&chip->mutex);
1397 static int ofdm_qual_db(u8 status_quality, u8 rate, unsigned int size)
1399 static const u16 constants[] = {
1400 715, 655, 585, 540, 470, 410, 360, 315,
1401 270, 235, 205, 175, 150, 125, 105, 85,
1408 /* It seems that their quality parameter is somehow per signal
1409 * and is now transferred per bit.
1412 case ZD_OFDM_RATE_6M:
1413 case ZD_OFDM_RATE_12M:
1414 case ZD_OFDM_RATE_24M:
1417 case ZD_OFDM_RATE_9M:
1418 case ZD_OFDM_RATE_18M:
1419 case ZD_OFDM_RATE_36M:
1420 case ZD_OFDM_RATE_54M:
1424 case ZD_OFDM_RATE_48M:
1432 x = (10000 * status_quality)/size;
1433 for (i = 0; i < ARRAY_SIZE(constants); i++) {
1434 if (x > constants[i])
1441 static unsigned int log10times100(unsigned int x)
1443 static const u8 log10[] = {
1445 0, 30, 47, 60, 69, 77, 84, 90, 95, 100,
1446 104, 107, 111, 114, 117, 120, 123, 125, 127, 130,
1447 132, 134, 136, 138, 139, 141, 143, 144, 146, 147,
1448 149, 150, 151, 153, 154, 155, 156, 157, 159, 160,
1449 161, 162, 163, 164, 165, 166, 167, 168, 169, 169,
1450 170, 171, 172, 173, 174, 174, 175, 176, 177, 177,
1451 178, 179, 179, 180, 181, 181, 182, 183, 183, 184,
1452 185, 185, 186, 186, 187, 188, 188, 189, 189, 190,
1453 190, 191, 191, 192, 192, 193, 193, 194, 194, 195,
1454 195, 196, 196, 197, 197, 198, 198, 199, 199, 200,
1455 200, 200, 201, 201, 202, 202, 202, 203, 203, 204,
1456 204, 204, 205, 205, 206, 206, 206, 207, 207, 207,
1457 208, 208, 208, 209, 209, 210, 210, 210, 211, 211,
1458 211, 212, 212, 212, 213, 213, 213, 213, 214, 214,
1459 214, 215, 215, 215, 216, 216, 216, 217, 217, 217,
1460 217, 218, 218, 218, 219, 219, 219, 219, 220, 220,
1461 220, 220, 221, 221, 221, 222, 222, 222, 222, 223,
1462 223, 223, 223, 224, 224, 224, 224,
1465 return x < ARRAY_SIZE(log10) ? log10[x] : 225;
1469 MAX_CCK_EVM_DB = 45,
1472 static int cck_evm_db(u8 status_quality)
1474 return (20 * log10times100(status_quality)) / 100;
1477 static int cck_snr_db(u8 status_quality)
1479 int r = MAX_CCK_EVM_DB - cck_evm_db(status_quality);
1484 static int rx_qual_db(const void *rx_frame, unsigned int size,
1485 const struct rx_status *status)
1487 return (status->frame_status&ZD_RX_OFDM) ?
1488 ofdm_qual_db(status->signal_quality_ofdm,
1489 zd_ofdm_plcp_header_rate(rx_frame),
1491 cck_snr_db(status->signal_quality_cck);
1494 u8 zd_rx_qual_percent(const void *rx_frame, unsigned int size,
1495 const struct rx_status *status)
1497 int r = rx_qual_db(rx_frame, size, status);
1506 u8 zd_rx_strength_percent(u8 rssi)
1508 int r = (rssi*100) / 30;
1514 u16 zd_rx_rate(const void *rx_frame, const struct rx_status *status)
1516 static const u16 ofdm_rates[] = {
1517 [ZD_OFDM_RATE_6M] = 60,
1518 [ZD_OFDM_RATE_9M] = 90,
1519 [ZD_OFDM_RATE_12M] = 120,
1520 [ZD_OFDM_RATE_18M] = 180,
1521 [ZD_OFDM_RATE_24M] = 240,
1522 [ZD_OFDM_RATE_36M] = 360,
1523 [ZD_OFDM_RATE_48M] = 480,
1524 [ZD_OFDM_RATE_54M] = 540,
1527 if (status->frame_status & ZD_RX_OFDM) {
1528 u8 ofdm_rate = zd_ofdm_plcp_header_rate(rx_frame);
1529 rate = ofdm_rates[ofdm_rate & 0xf];
1531 u8 cck_rate = zd_cck_plcp_header_rate(rx_frame);
1533 case ZD_CCK_SIGNAL_1M:
1536 case ZD_CCK_SIGNAL_2M:
1539 case ZD_CCK_SIGNAL_5M5:
1542 case ZD_CCK_SIGNAL_11M:
1553 int zd_chip_switch_radio_on(struct zd_chip *chip)
1557 mutex_lock(&chip->mutex);
1558 r = zd_switch_radio_on(&chip->rf);
1559 mutex_unlock(&chip->mutex);
1563 int zd_chip_switch_radio_off(struct zd_chip *chip)
1567 mutex_lock(&chip->mutex);
1568 r = zd_switch_radio_off(&chip->rf);
1569 mutex_unlock(&chip->mutex);
1573 int zd_chip_enable_int(struct zd_chip *chip)
1577 mutex_lock(&chip->mutex);
1578 r = zd_usb_enable_int(&chip->usb);
1579 mutex_unlock(&chip->mutex);
1583 void zd_chip_disable_int(struct zd_chip *chip)
1585 mutex_lock(&chip->mutex);
1586 zd_usb_disable_int(&chip->usb);
1587 mutex_unlock(&chip->mutex);
1590 int zd_chip_enable_rx(struct zd_chip *chip)
1594 mutex_lock(&chip->mutex);
1595 r = zd_usb_enable_rx(&chip->usb);
1596 mutex_unlock(&chip->mutex);
1600 void zd_chip_disable_rx(struct zd_chip *chip)
1602 mutex_lock(&chip->mutex);
1603 zd_usb_disable_rx(&chip->usb);
1604 mutex_unlock(&chip->mutex);
1607 int zd_rfwritev_locked(struct zd_chip *chip,
1608 const u32* values, unsigned int count, u8 bits)
1613 for (i = 0; i < count; i++) {
1614 r = zd_rfwrite_locked(chip, values[i], bits);
1623 * We can optionally program the RF directly through CR regs, if supported by
1624 * the hardware. This is much faster than the older method.
1626 int zd_rfwrite_cr_locked(struct zd_chip *chip, u32 value)
1628 struct zd_ioreq16 ioreqs[] = {
1629 { CR244, (value >> 16) & 0xff },
1630 { CR243, (value >> 8) & 0xff },
1631 { CR242, value & 0xff },
1633 ZD_ASSERT(mutex_is_locked(&chip->mutex));
1634 return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs));
1637 int zd_rfwritev_cr_locked(struct zd_chip *chip,
1638 const u32 *values, unsigned int count)
1643 for (i = 0; i < count; i++) {
1644 r = zd_rfwrite_cr_locked(chip, values[i]);