2 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification.
11 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12 * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13 * redistribution must be conditioned upon including a substantially
14 * similar Disclaimer requirement for further binary redistribution.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGES.
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD: head/sys/dev/siba/siba_core.c 257241 2013-10-28 07:29:16Z glebius $");
34 * the Sonics Silicon Backplane driver.
39 #include <sys/param.h>
40 #include <sys/systm.h>
41 #include <sys/malloc.h>
42 #include <sys/module.h>
43 #include <sys/kernel.h>
44 #include <sys/endian.h>
45 #include <sys/errno.h>
47 #include <sys/bus_resource.h>
50 #include <sys/socket.h>
52 #include <bus/pci/pcivar.h>
53 #include <bus/pci/pcireg.h>
61 SIBA_DEBUG_SCAN = 0x00000001, /* scan */
62 SIBA_DEBUG_PMU = 0x00000002, /* PMU */
63 SIBA_DEBUG_PLL = 0x00000004, /* PLL */
64 SIBA_DEBUG_SWITCHCORE = 0x00000008, /* switching core */
65 SIBA_DEBUG_SPROM = 0x00000010, /* SPROM */
66 SIBA_DEBUG_CORE = 0x00000020, /* handling cores */
67 SIBA_DEBUG_ANY = 0xffffffff
69 #define DPRINTF(siba, m, fmt, ...) do { \
71 kprintf(fmt, __VA_ARGS__); \
74 #define DPRINTF(siba, m, fmt, ...)
76 #define N(a) (sizeof(a) / sizeof(a[0]))
78 static void siba_pci_gpio(struct siba_softc *, uint32_t, int);
79 static void siba_scan(struct siba_softc *);
80 static int siba_switchcore(struct siba_softc *, uint8_t);
81 static int siba_pci_switchcore_sub(struct siba_softc *, uint8_t);
82 static uint32_t siba_scan_read_4(struct siba_softc *, uint8_t, uint16_t);
83 static uint16_t siba_dev2chipid(struct siba_softc *);
84 static uint16_t siba_pci_read_2(struct siba_dev_softc *, uint16_t);
85 static uint32_t siba_pci_read_4(struct siba_dev_softc *, uint16_t);
86 static void siba_pci_write_2(struct siba_dev_softc *, uint16_t, uint16_t);
87 static void siba_pci_write_4(struct siba_dev_softc *, uint16_t, uint32_t);
88 static void siba_cc_clock(struct siba_cc *,
90 static void siba_cc_pmu_init(struct siba_cc *);
91 static void siba_cc_power_init(struct siba_cc *);
92 static void siba_cc_powerup_delay(struct siba_cc *);
93 static int siba_cc_clockfreq(struct siba_cc *, int);
94 static void siba_cc_pmu1_pll0_init(struct siba_cc *, uint32_t);
95 static void siba_cc_pmu0_pll0_init(struct siba_cc *, uint32_t);
96 static enum siba_clksrc siba_cc_clksrc(struct siba_cc *);
97 static const struct siba_cc_pmu1_plltab *siba_cc_pmu1_plltab_find(uint32_t);
98 static uint32_t siba_cc_pll_read(struct siba_cc *, uint32_t);
99 static void siba_cc_pll_write(struct siba_cc *, uint32_t,
101 static const struct siba_cc_pmu0_plltab *
102 siba_cc_pmu0_plltab_findentry(uint32_t);
103 static int siba_pci_sprom(struct siba_softc *, struct siba_sprom *);
104 static int siba_sprom_read(struct siba_softc *, uint16_t *, uint16_t);
105 static int sprom_check_crc(const uint16_t *, size_t);
106 static uint8_t siba_crc8(uint8_t, uint8_t);
107 static void siba_sprom_r123(struct siba_sprom *, const uint16_t *);
108 static void siba_sprom_r45(struct siba_sprom *, const uint16_t *);
109 static void siba_sprom_r8(struct siba_sprom *, const uint16_t *);
110 static int8_t siba_sprom_r123_antgain(uint8_t, const uint16_t *, uint16_t,
112 static uint32_t siba_tmslow_reject_bitmask(struct siba_dev_softc *);
113 static uint32_t siba_pcicore_read_4(struct siba_pci *, uint16_t);
114 static void siba_pcicore_write_4(struct siba_pci *, uint16_t, uint32_t);
115 static uint32_t siba_pcie_read(struct siba_pci *, uint32_t);
116 static void siba_pcie_write(struct siba_pci *, uint32_t, uint32_t);
117 static void siba_pcie_mdio_write(struct siba_pci *, uint8_t, uint8_t,
119 static void siba_pci_read_multi_1(struct siba_dev_softc *, void *, size_t,
121 static void siba_pci_read_multi_2(struct siba_dev_softc *, void *, size_t,
123 static void siba_pci_read_multi_4(struct siba_dev_softc *, void *, size_t,
125 static void siba_pci_write_multi_1(struct siba_dev_softc *, const void *,
127 static void siba_pci_write_multi_2(struct siba_dev_softc *, const void *,
129 static void siba_pci_write_multi_4(struct siba_dev_softc *, const void *,
131 static const char *siba_core_name(uint16_t);
132 static void siba_pcicore_init(struct siba_pci *);
133 static uint32_t siba_read_4_sub(struct siba_dev_softc *, uint16_t);
134 static void siba_write_4_sub(struct siba_dev_softc *, uint16_t, uint32_t);
135 static void siba_powerup_sub(struct siba_softc *, int);
136 static int siba_powerdown_sub(struct siba_softc *);
137 static int siba_dev_isup_sub(struct siba_dev_softc *);
138 static void siba_dev_up_sub(struct siba_dev_softc *, uint32_t);
139 static void siba_dev_down_sub(struct siba_dev_softc *, uint32_t);
140 int siba_core_attach(struct siba_softc *);
141 int siba_core_detach(struct siba_softc *);
142 int siba_core_suspend(struct siba_softc *);
143 int siba_core_resume(struct siba_softc *);
144 uint8_t siba_getncores(device_t, uint16_t);
146 static const struct siba_bus_ops siba_pci_ops = {
147 .read_2 = siba_pci_read_2,
148 .read_4 = siba_pci_read_4,
149 .write_2 = siba_pci_write_2,
150 .write_4 = siba_pci_write_4,
151 .read_multi_1 = siba_pci_read_multi_1,
152 .read_multi_2 = siba_pci_read_multi_2,
153 .read_multi_4 = siba_pci_read_multi_4,
154 .write_multi_1 = siba_pci_write_multi_1,
155 .write_multi_2 = siba_pci_write_multi_2,
156 .write_multi_4 = siba_pci_write_multi_4,
159 static const struct siba_cc_pmu_res_updown siba_cc_pmu_4325_updown[] =
160 SIBA_CC_PMU_4325_RES_UPDOWN;
161 static const struct siba_cc_pmu_res_depend siba_cc_pmu_4325_depend[] =
162 SIBA_CC_PMU_4325_RES_DEPEND;
163 static const struct siba_cc_pmu_res_updown siba_cc_pmu_4328_updown[] =
164 SIBA_CC_PMU_4328_RES_UPDOWN;
165 static const struct siba_cc_pmu_res_depend siba_cc_pmu_4328_depend[] =
166 SIBA_CC_PMU_4328_RES_DEPEND;
167 static const struct siba_cc_pmu0_plltab siba_cc_pmu0_plltab[] =
168 SIBA_CC_PMU0_PLLTAB_ENTRY;
169 static const struct siba_cc_pmu1_plltab siba_cc_pmu1_plltab[] =
170 SIBA_CC_PMU1_PLLTAB_ENTRY;
173 siba_core_attach(struct siba_softc *siba)
178 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
179 ("unsupported BUS type (%#x)", siba->siba_type));
181 siba->siba_ops = &siba_pci_ops;
183 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
186 /* XXX init PCI or PCMCIA host devices */
188 siba_powerup_sub(siba, 0);
190 /* init ChipCommon */
191 scc = &siba->siba_cc;
192 if (scc->scc_dev != NULL) {
193 siba_cc_pmu_init(scc);
194 siba_cc_power_init(scc);
195 siba_cc_clock(scc, SIBA_CLOCK_FAST);
196 siba_cc_powerup_delay(scc);
199 error = siba_pci_sprom(siba, &siba->siba_sprom);
201 siba_powerdown_sub(siba);
205 siba_pcicore_init(&siba->siba_pci);
206 siba_powerdown_sub(siba);
208 return (bus_generic_attach(siba->siba_dev));
212 siba_core_detach(struct siba_softc *siba)
214 /* detach & delete all children */
215 device_delete_children(siba->siba_dev);
220 siba_pci_gpio(struct siba_softc *siba, uint32_t what, int on)
225 if (siba->siba_type != SIBA_TYPE_PCI)
228 out = pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4);
230 if (what & SIBA_GPIO_PLL)
231 out |= SIBA_GPIO_PLL;
232 if (what & SIBA_GPIO_CRYSTAL)
233 out &= ~SIBA_GPIO_CRYSTAL;
234 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
235 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT_EN,
236 pci_read_config(siba->siba_dev,
237 SIBA_GPIO_OUT_EN, 4) | what, 4);
241 in = pci_read_config(siba->siba_dev, SIBA_GPIO_IN, 4);
242 if ((in & SIBA_GPIO_CRYSTAL) != SIBA_GPIO_CRYSTAL) {
243 if (what & SIBA_GPIO_CRYSTAL) {
244 out |= SIBA_GPIO_CRYSTAL;
245 if (what & SIBA_GPIO_PLL)
246 out |= SIBA_GPIO_PLL;
247 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
248 pci_write_config(siba->siba_dev,
249 SIBA_GPIO_OUT_EN, pci_read_config(siba->siba_dev,
250 SIBA_GPIO_OUT_EN, 4) | what, 4);
253 if (what & SIBA_GPIO_PLL) {
254 out &= ~SIBA_GPIO_PLL;
255 pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
260 status = pci_read_config(siba->siba_dev, PCIR_STATUS, 2);
261 status &= ~PCIM_STATUS_STABORT;
262 pci_write_config(siba->siba_dev, PCIR_STATUS, status, 2);
266 siba_scan(struct siba_softc *siba)
268 struct siba_dev_softc *sd;
271 int base, dev_i = 0, error, i, is_pcie, n_80211 = 0, n_cc = 0,
274 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
275 ("unsupported BUS type (%#x)", siba->siba_type));
277 siba->siba_ndevs = 0;
278 error = siba_switchcore(siba, 0); /* need the first core */
282 idhi = siba_scan_read_4(siba, 0, SIBA_IDHIGH);
283 if (SIBA_IDHIGH_CORECODE(idhi) == SIBA_DEVID_CHIPCOMMON) {
284 tmp = siba_scan_read_4(siba, 0, SIBA_CC_CHIPID);
285 siba->siba_chipid = SIBA_CC_ID(tmp);
286 siba->siba_chiprev = SIBA_CC_REV(tmp);
287 siba->siba_chippkg = SIBA_CC_PKG(tmp);
288 if (SIBA_IDHIGH_REV(idhi) >= 4)
289 siba->siba_ndevs = SIBA_CC_NCORES(tmp);
290 siba->siba_cc.scc_caps = siba_scan_read_4(siba, 0,
293 if (siba->siba_type == SIBA_TYPE_PCI) {
294 siba->siba_chipid = siba_dev2chipid(siba);
295 siba->siba_chiprev = pci_read_config(siba->siba_dev,
297 siba->siba_chippkg = 0;
299 siba->siba_chipid = 0x4710;
300 siba->siba_chiprev = 0;
301 siba->siba_chippkg = 0;
304 if (siba->siba_ndevs == 0)
305 siba->siba_ndevs = siba_getncores(siba->siba_dev,
307 if (siba->siba_ndevs > SIBA_MAX_CORES) {
308 device_printf(siba->siba_dev,
309 "too many siba cores (max %d %d)\n",
310 SIBA_MAX_CORES, siba->siba_ndevs);
314 /* looking basic information about each cores/devices */
315 for (i = 0; i < siba->siba_ndevs; i++) {
316 error = siba_switchcore(siba, i);
319 sd = &(siba->siba_devs[dev_i]);
320 idhi = siba_scan_read_4(siba, i, SIBA_IDHIGH);
322 sd->sd_id.sd_device = SIBA_IDHIGH_CORECODE(idhi);
323 sd->sd_id.sd_rev = SIBA_IDHIGH_REV(idhi);
324 sd->sd_id.sd_vendor = SIBA_IDHIGH_VENDOR(idhi);
325 sd->sd_ops = siba->siba_ops;
328 DPRINTF(siba, SIBA_DEBUG_SCAN,
329 "core %d (%s) found (cc %#xrev %#x vendor %#x)\n",
330 i, siba_core_name(sd->sd_id.sd_device),
331 sd->sd_id.sd_device, sd->sd_id.sd_rev, sd->sd_id.sd_vendor);
333 switch (sd->sd_id.sd_device) {
334 case SIBA_DEVID_CHIPCOMMON:
337 device_printf(siba->siba_dev,
338 "warn: multiple ChipCommon\n");
341 siba->siba_cc.scc_dev = sd;
343 case SIBA_DEVID_80211:
346 device_printf(siba->siba_dev,
347 "warn: multiple 802.11 core\n");
352 case SIBA_DEVID_PCIE:
354 error = pci_find_extcap(siba->siba_dev, PCIY_EXPRESS,
356 is_pcie = (error == 0) ? 1 : 0;
359 device_printf(siba->siba_dev,
360 "warn: multiple PCI(E) cores\n");
363 if (sd->sd_id.sd_device == SIBA_DEVID_PCI &&
366 if (sd->sd_id.sd_device == SIBA_DEVID_PCIE &&
369 siba->siba_pci.spc_dev = sd;
371 case SIBA_DEVID_MODEM:
372 case SIBA_DEVID_PCMCIA:
375 device_printf(siba->siba_dev,
376 "unsupported coreid (%s)\n",
377 siba_core_name(sd->sd_id.sd_device));
382 child = device_add_child(siba->siba_dev, NULL, -1);
384 device_printf(siba->siba_dev, "child attach failed\n");
388 device_set_ivars(child, sd);
390 siba->siba_ndevs = dev_i;
394 siba_switchcore(struct siba_softc *siba, uint8_t idx)
397 switch (siba->siba_type) {
399 return (siba_pci_switchcore_sub(siba, idx));
402 ("%s: unsupported bustype %#x", __func__,
409 siba_pci_switchcore_sub(struct siba_softc *siba, uint8_t idx)
415 dir = SIBA_REGWIN(idx);
417 for (i = 0; i < RETRY_MAX; i++) {
418 pci_write_config(siba->siba_dev, SIBA_BAR0, dir, 4);
419 if (pci_read_config(siba->siba_dev, SIBA_BAR0, 4) == dir)
428 siba_pci_switchcore(struct siba_softc *siba, struct siba_dev_softc *sd)
432 DPRINTF(siba, SIBA_DEBUG_SWITCHCORE, "Switching to %s core, index %d\n",
433 siba_core_name(sd->sd_id.sd_device), sd->sd_coreidx);
435 error = siba_pci_switchcore_sub(siba, sd->sd_coreidx);
437 siba->siba_curdev = sd;
443 siba_scan_read_4(struct siba_softc *siba, uint8_t coreidx,
448 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
449 ("unsupported BUS type (%#x)", siba->siba_type));
451 return (SIBA_READ_4(siba, offset));
455 siba_dev2chipid(struct siba_softc *siba)
459 switch (siba->siba_pci_did) {
495 case PCI_DEVICE_ID_BCM4401:
496 case PCI_DEVICE_ID_BCM4401B0:
497 case PCI_DEVICE_ID_BCM4401B1:
501 device_printf(siba->siba_dev, "unknown PCI did (%d)\n",
509 * Earlier ChipCommon revisions have hardcoded number of cores
510 * present dependent on the ChipCommon ID.
513 siba_getncores(device_t dev, uint16_t chipid)
524 case SIBA_CCID_SENTRY5:
528 case SIBA_CCID_BCM4710:
530 case SIBA_CCID_BCM4704:
533 device_printf(dev, "unknown the chipset ID %#x\n", chipid);
540 siba_core_name(uint16_t coreid)
544 case SIBA_DEVID_CHIPCOMMON:
545 return ("ChipCommon");
546 case SIBA_DEVID_ILINE20:
548 case SIBA_DEVID_SDRAM:
552 case SIBA_DEVID_MIPS:
554 case SIBA_DEVID_ETHERNET:
555 return ("Fast Ethernet");
556 case SIBA_DEVID_MODEM:
558 case SIBA_DEVID_USB11_HOSTDEV:
559 return ("USB 1.1 Hostdev");
560 case SIBA_DEVID_ADSL:
562 case SIBA_DEVID_ILINE100:
563 return ("ILine 100");
564 case SIBA_DEVID_IPSEC:
566 case SIBA_DEVID_PCMCIA:
568 case SIBA_DEVID_INTERNAL_MEM:
569 return ("Internal Memory");
570 case SIBA_DEVID_SDRAMDDR:
571 return ("MEMC SDRAM");
572 case SIBA_DEVID_EXTIF:
574 case SIBA_DEVID_80211:
575 return ("IEEE 802.11");
576 case SIBA_DEVID_MIPS_3302:
577 return ("MIPS 3302");
578 case SIBA_DEVID_USB11_HOST:
579 return ("USB 1.1 Host");
580 case SIBA_DEVID_USB11_DEV:
581 return ("USB 1.1 Device");
582 case SIBA_DEVID_USB20_HOST:
583 return ("USB 2.0 Host");
584 case SIBA_DEVID_USB20_DEV:
585 return ("USB 2.0 Device");
586 case SIBA_DEVID_SDIO_HOST:
587 return ("SDIO Host");
588 case SIBA_DEVID_ROBOSWITCH:
589 return ("Roboswitch");
590 case SIBA_DEVID_PARA_ATA:
592 case SIBA_DEVID_SATA_XORDMA:
593 return ("SATA XOR-DMA");
594 case SIBA_DEVID_ETHERNET_GBIT:
595 return ("GBit Ethernet");
596 case SIBA_DEVID_PCIE:
597 return ("PCI-Express");
598 case SIBA_DEVID_MIMO_PHY:
600 case SIBA_DEVID_SRAM_CTRLR:
601 return ("SRAM Controller");
602 case SIBA_DEVID_MINI_MACPHY:
603 return ("Mini MACPHY");
604 case SIBA_DEVID_ARM_1176:
606 case SIBA_DEVID_ARM_7TDMI:
607 return ("ARM 7TDMI");
613 siba_pci_read_2(struct siba_dev_softc *sd, uint16_t offset)
615 struct siba_softc *siba = sd->sd_bus;
617 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
620 return (SIBA_READ_2(siba, offset));
624 siba_pci_read_4(struct siba_dev_softc *sd, uint16_t offset)
626 struct siba_softc *siba = sd->sd_bus;
628 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
631 return (SIBA_READ_4(siba, offset));
635 siba_pci_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value)
637 struct siba_softc *siba = sd->sd_bus;
639 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
642 SIBA_WRITE_2(siba, offset, value);
646 siba_pci_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
648 struct siba_softc *siba = sd->sd_bus;
650 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
653 SIBA_WRITE_4(siba, offset, value);
657 siba_pci_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count,
660 struct siba_softc *siba = sd->sd_bus;
662 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
663 memset(buffer, 0xff, count);
667 SIBA_READ_MULTI_1(siba, offset, buffer, count);
671 siba_pci_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count,
674 struct siba_softc *siba = sd->sd_bus;
676 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
677 memset(buffer, 0xff, count);
681 KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
682 SIBA_READ_MULTI_2(siba, offset, buffer, count >> 1);
686 siba_pci_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count,
689 struct siba_softc *siba = sd->sd_bus;
691 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
692 memset(buffer, 0xff, count);
696 KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
697 SIBA_READ_MULTI_4(siba, offset, buffer, count >> 2);
701 siba_pci_write_multi_1(struct siba_dev_softc *sd, const void *buffer,
702 size_t count, uint16_t offset)
704 struct siba_softc *siba = sd->sd_bus;
706 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
709 SIBA_WRITE_MULTI_1(siba, offset, buffer, count);
713 siba_pci_write_multi_2(struct siba_dev_softc *sd, const void *buffer,
714 size_t count, uint16_t offset)
716 struct siba_softc *siba = sd->sd_bus;
718 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
721 KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
722 SIBA_WRITE_MULTI_2(siba, offset, buffer, count >> 1);
726 siba_pci_write_multi_4(struct siba_dev_softc *sd, const void *buffer,
727 size_t count, uint16_t offset)
729 struct siba_softc *siba = sd->sd_bus;
731 if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
734 KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
735 SIBA_WRITE_MULTI_4(siba, offset, buffer, count >> 2);
739 siba_powerup(device_t dev, int dynamic)
741 struct siba_dev_softc *sd = device_get_ivars(dev);
742 struct siba_softc *siba = sd->sd_bus;
744 siba_powerup_sub(siba, dynamic);
748 siba_powerup_sub(struct siba_softc *siba, int dynamic)
751 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
752 siba_cc_clock(&siba->siba_cc,
753 (dynamic != 0) ? SIBA_CLOCK_DYNAMIC : SIBA_CLOCK_FAST);
757 siba_cc_clock(struct siba_cc *scc, enum siba_clock clock)
759 struct siba_dev_softc *sd = scc->scc_dev;
760 struct siba_softc *siba;
767 * chipcommon < r6 (no dynamic clock control)
768 * chipcommon >= r10 (unknown)
770 if (sd->sd_id.sd_rev < 6 || sd->sd_id.sd_rev >= 10 ||
771 (scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
775 case SIBA_CLOCK_DYNAMIC:
776 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) &
777 ~(SIBA_CC_CLKSLOW_ENXTAL | SIBA_CC_CLKSLOW_FSLOW |
778 SIBA_CC_CLKSLOW_IPLL);
779 if ((tmp & SIBA_CC_CLKSLOW_SRC) != SIBA_CC_CLKSLOW_SRC_CRYSTAL)
780 tmp |= SIBA_CC_CLKSLOW_ENXTAL;
781 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW, tmp);
782 if (tmp & SIBA_CC_CLKSLOW_ENXTAL)
783 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 0);
785 case SIBA_CLOCK_SLOW:
786 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW,
787 SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) |
788 SIBA_CC_CLKSLOW_FSLOW);
790 case SIBA_CLOCK_FAST:
792 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL, 1);
793 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSLOW,
794 (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) |
795 SIBA_CC_CLKSLOW_IPLL) & ~SIBA_CC_CLKSLOW_FSLOW);
799 ("%s: unsupported clock %#x", __func__, clock));
804 siba_read_2(device_t dev, uint16_t offset)
806 struct siba_dev_softc *sd = device_get_ivars(dev);
808 return (sd->sd_ops->read_2(sd, offset));
812 siba_read_4(device_t dev, uint16_t offset)
814 struct siba_dev_softc *sd = device_get_ivars(dev);
816 return (siba_read_4_sub(sd, offset));
820 siba_read_4_sub(struct siba_dev_softc *sd, uint16_t offset)
823 return (sd->sd_ops->read_4(sd, offset));
827 siba_write_2(device_t dev, uint16_t offset, uint16_t value)
829 struct siba_dev_softc *sd = device_get_ivars(dev);
831 sd->sd_ops->write_2(sd, offset, value);
835 siba_write_4(device_t dev, uint16_t offset, uint32_t value)
837 struct siba_dev_softc *sd = device_get_ivars(dev);
839 return (siba_write_4_sub(sd, offset, value));
843 siba_write_4_sub(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
846 sd->sd_ops->write_4(sd, offset, value);
850 siba_read_multi_1(device_t dev, void *buffer, size_t count,
853 struct siba_dev_softc *sd = device_get_ivars(dev);
855 sd->sd_ops->read_multi_1(sd, buffer, count, offset);
859 siba_read_multi_2(device_t dev, void *buffer, size_t count,
862 struct siba_dev_softc *sd = device_get_ivars(dev);
864 sd->sd_ops->read_multi_2(sd, buffer, count, offset);
868 siba_read_multi_4(device_t dev, void *buffer, size_t count,
871 struct siba_dev_softc *sd = device_get_ivars(dev);
873 sd->sd_ops->read_multi_4(sd, buffer, count, offset);
877 siba_write_multi_1(device_t dev, const void *buffer, size_t count,
880 struct siba_dev_softc *sd = device_get_ivars(dev);
882 sd->sd_ops->write_multi_1(sd, buffer, count, offset);
886 siba_write_multi_2(device_t dev, const void *buffer, size_t count,
889 struct siba_dev_softc *sd = device_get_ivars(dev);
891 sd->sd_ops->write_multi_2(sd, buffer, count, offset);
895 siba_write_multi_4(device_t dev, const void *buffer, size_t count,
898 struct siba_dev_softc *sd = device_get_ivars(dev);
900 sd->sd_ops->write_multi_4(sd, buffer, count, offset);
904 siba_cc_pmu_init(struct siba_cc *scc)
906 const struct siba_cc_pmu_res_updown *updown = NULL;
907 const struct siba_cc_pmu_res_depend *depend = NULL;
908 struct siba_dev_softc *sd = scc->scc_dev;
909 struct siba_softc *siba = sd->sd_bus;
910 uint32_t min = 0, max = 0, pmucap;
911 unsigned int i, updown_size, depend_size;
913 if ((scc->scc_caps & SIBA_CC_CAPS_PMU) == 0)
916 pmucap = SIBA_CC_READ32(scc, SIBA_CC_PMUCAPS);
917 scc->scc_pmu.rev = (pmucap & SIBA_CC_PMUCAPS_REV);
919 DPRINTF(siba, SIBA_DEBUG_PMU, "PMU(r%u) found (caps %#x)\n",
920 scc->scc_pmu.rev, pmucap);
922 if (scc->scc_pmu.rev >= 1) {
923 if (siba->siba_chiprev < 2 && siba->siba_chipid == 0x4325)
924 SIBA_CC_MASK32(scc, SIBA_CC_PMUCTL,
925 ~SIBA_CC_PMUCTL_NOILP);
927 SIBA_CC_SET32(scc, SIBA_CC_PMUCTL,
928 SIBA_CC_PMUCTL_NOILP);
931 /* initialize PLL & PMU resources */
932 switch (siba->siba_chipid) {
934 siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
935 /* use the default: min = 0xcbb max = 0x7ffff */
938 siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
940 updown = siba_cc_pmu_4325_updown;
941 updown_size = N(siba_cc_pmu_4325_updown);
942 depend = siba_cc_pmu_4325_depend;
943 depend_size = N(siba_cc_pmu_4325_depend);
945 min = (1 << SIBA_CC_PMU_4325_BURST) |
946 (1 << SIBA_CC_PMU_4325_LN);
947 if (SIBA_CC_READ32(scc, SIBA_CC_CHIPSTAT) &
948 SIBA_CC_CHST_4325_PMUTOP_2B)
949 min |= (1 << SIBA_CC_PMU_4325_CLBURST);
953 siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
955 updown = siba_cc_pmu_4328_updown;
956 updown_size = N(siba_cc_pmu_4328_updown);
957 depend = siba_cc_pmu_4328_depend;
958 depend_size = N(siba_cc_pmu_4328_depend);
960 min = (1 << SIBA_CC_PMU_4328_EXT_SWITCH_PWM) |
961 (1 << SIBA_CC_PMU_4328_BB_SWITCH_PWM) |
962 (1 << SIBA_CC_PMU_4328_CRYSTAL_EN);
967 siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
972 device_printf(siba->siba_dev,
973 "unknown chipid %#x for PLL & PMU init\n",
978 for (i = 0; i < updown_size; i++) {
979 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
981 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_UPDNTM,
986 for (i = 0; i < depend_size; i++) {
987 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
989 switch (depend[i].task) {
990 case SIBA_CC_PMU_DEP_SET:
991 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_DEPMSK,
994 case SIBA_CC_PMU_DEP_ADD:
995 SIBA_CC_SET32(scc, SIBA_CC_PMU_DEPMSK,
998 case SIBA_CC_PMU_DEP_REMOVE:
999 SIBA_CC_MASK32(scc, SIBA_CC_PMU_DEPMSK,
1000 ~(depend[i].depend));
1004 ("%s:%d: assertion failed",
1005 __func__, __LINE__));
1011 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MINRES, min);
1013 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MAXRES, max);
1017 siba_cc_power_init(struct siba_cc *scc)
1019 struct siba_softc *siba = scc->scc_dev->sd_bus;
1022 if (siba->siba_chipid == 0x4321) {
1023 if (siba->siba_chiprev == 0)
1024 SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0x3a4);
1025 else if (siba->siba_chiprev == 1)
1026 SIBA_CC_WRITE32(scc, SIBA_CC_CHIPCTL, 0xa4);
1029 if ((scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
1032 if (scc->scc_dev->sd_id.sd_rev >= 10)
1033 SIBA_CC_WRITE32(scc, SIBA_CC_CLKSYSCTL,
1034 (SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) &
1037 maxfreq = siba_cc_clockfreq(scc, 1);
1038 SIBA_CC_WRITE32(scc, SIBA_CC_PLLONDELAY,
1039 (maxfreq * 150 + 999999) / 1000000);
1040 SIBA_CC_WRITE32(scc, SIBA_CC_FREFSELDELAY,
1041 (maxfreq * 15 + 999999) / 1000000);
1046 siba_cc_powerup_delay(struct siba_cc *scc)
1048 struct siba_softc *siba = scc->scc_dev->sd_bus;
1051 if (siba->siba_type != SIBA_TYPE_PCI ||
1052 !(scc->scc_caps & SIBA_CC_CAPS_PWCTL))
1055 min = siba_cc_clockfreq(scc, 0);
1056 scc->scc_powerup_delay =
1057 (((SIBA_CC_READ32(scc, SIBA_CC_PLLONDELAY) + 2) * 1000000) +
1062 siba_cc_clockfreq(struct siba_cc *scc, int max)
1064 enum siba_clksrc src;
1065 int div = 1, limit = 0;
1067 src = siba_cc_clksrc(scc);
1068 if (scc->scc_dev->sd_id.sd_rev < 6) {
1069 div = (src == SIBA_CC_CLKSRC_PCI) ? 64 :
1070 (src == SIBA_CC_CLKSRC_CRYSTAL) ? 32 : 1;
1072 ("%s: unknown clock %d", __func__, src));
1073 } else if (scc->scc_dev->sd_id.sd_rev < 10) {
1075 case SIBA_CC_CLKSRC_CRYSTAL:
1076 case SIBA_CC_CLKSRC_PCI:
1077 div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) >> 16) +
1080 case SIBA_CC_CLKSRC_LOWPW:
1084 div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) >> 16) + 1) * 4;
1087 case SIBA_CC_CLKSRC_CRYSTAL:
1088 limit = (max) ? 20200000 : 19800000;
1090 case SIBA_CC_CLKSRC_LOWPW:
1091 limit = (max) ? 43000 : 25000;
1093 case SIBA_CC_CLKSRC_PCI:
1094 limit = (max) ? 34000000 : 25000000;
1098 return (limit / div);
1102 siba_cc_pmu1_pll0_init(struct siba_cc *scc, uint32_t freq)
1104 struct siba_dev_softc *sd = scc->scc_dev;
1105 struct siba_softc *siba = sd->sd_bus;
1106 const struct siba_cc_pmu1_plltab *e = NULL;
1107 uint32_t bufsth = 0, pll, pmu;
1110 KASSERT(freq == 0, ("%s:%d: assertion vail", __func__, __LINE__));
1111 if (siba->siba_chipid == 0x4312) {
1112 scc->scc_pmu.freq = 20000;
1116 e = siba_cc_pmu1_plltab_find(SIBA_CC_PMU1_DEFAULT_FREQ);
1117 KASSERT(e != NULL, ("%s:%d: assertion vail", __func__, __LINE__));
1118 scc->scc_pmu.freq = e->freq;
1120 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1121 if (SIBA_CC_PMUCTL_XF_VAL(pmu) == e->xf)
1124 DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1125 (e->freq / 1000), (e->freq % 1000));
1128 switch (siba->siba_chipid) {
1131 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1132 ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) |
1133 (1 << SIBA_CC_PMU_4325_HT)));
1134 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1135 ~((1 << SIBA_CC_PMU_4325_BBPLL_PWR) |
1136 (1 << SIBA_CC_PMU_4325_HT)));
1140 ("%s:%d: assertion failed", __func__, __LINE__));
1142 for (i = 0; i < 1500; i++) {
1143 if (!(SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) &
1144 SIBA_CC_CLKCTLSTATUS_HT))
1148 if (SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) & SIBA_CC_CLKCTLSTATUS_HT)
1149 device_printf(siba->siba_dev, "failed to turn PLL off!\n");
1151 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL0);
1152 pll &= ~(SIBA_CC_PMU1_PLL0_P1DIV | SIBA_CC_PMU1_PLL0_P2DIV);
1153 pll |= ((uint32_t)e->p1div << 20) & SIBA_CC_PMU1_PLL0_P1DIV;
1154 pll |= ((uint32_t)e->p2div << 24) & SIBA_CC_PMU1_PLL0_P2DIV;
1155 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL0, pll);
1157 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL2);
1158 pll &= ~(SIBA_CC_PMU1_PLL2_NDIVINT | SIBA_CC_PMU1_PLL2_NDIVMODE);
1159 pll |= ((uint32_t)e->ndiv_int << 20) & SIBA_CC_PMU1_PLL2_NDIVINT;
1160 pll |= (1 << 17) & SIBA_CC_PMU1_PLL2_NDIVMODE;
1161 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL2, pll);
1163 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL3);
1164 pll &= ~SIBA_CC_PMU1_PLL3_NDIVFRAC;
1165 pll |= ((uint32_t)e->ndiv_frac << 0) & SIBA_CC_PMU1_PLL3_NDIVFRAC;
1166 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL3, pll);
1169 pll = siba_cc_pll_read(scc, SIBA_CC_PMU1_PLL5);
1170 pll &= ~SIBA_CC_PMU1_PLL5_CLKDRV;
1171 pll |= (bufsth << 8) & SIBA_CC_PMU1_PLL5_CLKDRV;
1172 siba_cc_pll_write(scc, SIBA_CC_PMU1_PLL5, pll);
1175 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1176 pmu &= ~(SIBA_CC_PMUCTL_ILP | SIBA_CC_PMUCTL_XF);
1177 pmu |= ((((uint32_t)e->freq + 127) / 128 - 1) << 16) &
1179 pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1180 SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1184 siba_cc_pmu0_pll0_init(struct siba_cc *scc, uint32_t xtalfreq)
1186 struct siba_dev_softc *sd = scc->scc_dev;
1187 struct siba_softc *siba = sd->sd_bus;
1188 const struct siba_cc_pmu0_plltab *e = NULL;
1189 uint32_t pmu, tmp, pll;
1192 if ((siba->siba_chipid == 0x5354) && !xtalfreq)
1195 e = siba_cc_pmu0_plltab_findentry(xtalfreq);
1197 e = siba_cc_pmu0_plltab_findentry(
1198 SIBA_CC_PMU0_DEFAULT_XTALFREQ);
1199 KASSERT(e != NULL, ("%s:%d: fail", __func__, __LINE__));
1201 scc->scc_pmu.freq = e->freq;
1203 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1204 if (((pmu & SIBA_CC_PMUCTL_XF) >> 2) == e->xf)
1207 DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1208 (xtalfreq / 1000), (xtalfreq % 1000));
1210 KASSERT(siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354,
1211 ("%s:%d: fail", __func__, __LINE__));
1213 switch (siba->siba_chipid) {
1215 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1216 ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU));
1217 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1218 ~(1 << SIBA_CC_PMU_4328_BB_PLL_PU));
1221 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES,
1222 ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU));
1223 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MAXRES,
1224 ~(1 << SIBA_CC_PMU_5354_BB_PLL_PU));
1227 for (i = 1500; i; i--) {
1228 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1229 if (!(tmp & SIBA_CC_CLKCTLSTATUS_HT))
1233 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1234 if (tmp & SIBA_CC_CLKCTLSTATUS_HT)
1235 device_printf(siba->siba_dev, "failed to turn PLL off!\n");
1238 pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL0);
1239 if (xtalfreq >= SIBA_CC_PMU0_PLL0_PDIV_FREQ)
1240 pll |= SIBA_CC_PMU0_PLL0_PDIV_MSK;
1242 pll &= ~SIBA_CC_PMU0_PLL0_PDIV_MSK;
1243 siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL0, pll);
1246 pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL1);
1247 pll &= ~(SIBA_CC_PMU0_PLL1_STOPMOD | SIBA_CC_PMU0_PLL1_IMSK |
1248 SIBA_CC_PMU0_PLL1_FMSK);
1249 pll |= ((uint32_t)e->wb_int << 28) & SIBA_CC_PMU0_PLL1_IMSK;
1250 pll |= ((uint32_t)e->wb_frac << 8) & SIBA_CC_PMU0_PLL1_FMSK;
1251 if (e->wb_frac == 0)
1252 pll |= SIBA_CC_PMU0_PLL1_STOPMOD;
1253 siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL1, pll);
1256 pll = siba_cc_pll_read(scc, SIBA_CC_PMU0_PLL2);
1257 pll &= ~SIBA_CC_PMU0_PLL2_IMSKHI;
1258 pll |= (((uint32_t)e->wb_int >> 4) << 0) & SIBA_CC_PMU0_PLL2_IMSKHI;
1259 siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL2, pll);
1261 /* set freq and divisor. */
1262 pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1263 pmu &= ~SIBA_CC_PMUCTL_ILP;
1264 pmu |= (((xtalfreq + 127) / 128 - 1) << 16) & SIBA_CC_PMUCTL_ILP;
1265 pmu &= ~SIBA_CC_PMUCTL_XF;
1266 pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1267 SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1270 static enum siba_clksrc
1271 siba_cc_clksrc(struct siba_cc *scc)
1273 struct siba_dev_softc *sd = scc->scc_dev;
1274 struct siba_softc *siba = sd->sd_bus;
1276 if (sd->sd_id.sd_rev < 6) {
1277 if (siba->siba_type == SIBA_TYPE_PCI) {
1278 if (pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4) &
1280 return (SIBA_CC_CLKSRC_PCI);
1281 return (SIBA_CC_CLKSRC_CRYSTAL);
1283 if (siba->siba_type == SIBA_TYPE_SSB ||
1284 siba->siba_type == SIBA_TYPE_PCMCIA)
1285 return (SIBA_CC_CLKSRC_CRYSTAL);
1287 if (sd->sd_id.sd_rev < 10) {
1288 switch (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) & 0x7) {
1290 return (SIBA_CC_CLKSRC_LOWPW);
1292 return (SIBA_CC_CLKSRC_CRYSTAL);
1294 return (SIBA_CC_CLKSRC_PCI);
1300 return (SIBA_CC_CLKSRC_CRYSTAL);
1303 static const struct siba_cc_pmu1_plltab *
1304 siba_cc_pmu1_plltab_find(uint32_t crystalfreq)
1306 const struct siba_cc_pmu1_plltab *e;
1309 for (i = 0; i < N(siba_cc_pmu1_plltab); i++) {
1310 e = &siba_cc_pmu1_plltab[i];
1311 if (crystalfreq == e->freq)
1319 siba_cc_pll_read(struct siba_cc *scc, uint32_t offset)
1322 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1323 return (SIBA_CC_READ32(scc, SIBA_CC_PLLCTL_DATA));
1327 siba_cc_pll_write(struct siba_cc *scc, uint32_t offset, uint32_t value)
1330 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1331 SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_DATA, value);
1334 static const struct siba_cc_pmu0_plltab *
1335 siba_cc_pmu0_plltab_findentry(uint32_t crystalfreq)
1337 const struct siba_cc_pmu0_plltab *e;
1340 for (i = 0; i < N(siba_cc_pmu0_plltab); i++) {
1341 e = &siba_cc_pmu0_plltab[i];
1342 if (e->freq == crystalfreq)
1350 siba_pci_sprom(struct siba_softc *siba, struct siba_sprom *sprom)
1355 buf = kmalloc(SIBA_SPROMSIZE_R123 * sizeof(uint16_t),
1356 M_DEVBUF, M_INTWAIT | M_ZERO);
1357 siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R123);
1358 error = sprom_check_crc(buf, siba->siba_spromsize);
1360 kfree(buf, M_DEVBUF);
1361 buf = kmalloc(SIBA_SPROMSIZE_R4 * sizeof(uint16_t),
1362 M_DEVBUF, M_INTWAIT | M_ZERO);
1363 siba_sprom_read(siba, buf, SIBA_SPROMSIZE_R4);
1364 error = sprom_check_crc(buf, siba->siba_spromsize);
1366 device_printf(siba->siba_dev, "warn: bad SPROM CRC\n");
1369 bzero(sprom, sizeof(*sprom));
1371 sprom->rev = buf[siba->siba_spromsize - 1] & 0x00FF;
1372 DPRINTF(siba, SIBA_DEBUG_SPROM, "SPROM rev %d\n",
1374 memset(sprom->mac_eth, 0xff, 6);
1375 memset(sprom->mac_80211a, 0xff, 6);
1376 if ((siba->siba_chipid & 0xff00) == 0x4400) {
1378 siba_sprom_r123(sprom, buf);
1379 } else if (siba->siba_chipid == 0x4321) {
1381 siba_sprom_r45(sprom, buf);
1383 switch (sprom->rev) {
1387 siba_sprom_r123(sprom, buf);
1391 siba_sprom_r45(sprom, buf);
1394 siba_sprom_r8(sprom, buf);
1397 device_printf(siba->siba_dev,
1398 "unknown SPROM revision %d.\n", sprom->rev);
1399 siba_sprom_r123(sprom, buf);
1403 if (sprom->bf_lo == 0xffff)
1405 if (sprom->bf_hi == 0xffff)
1408 kfree(buf, M_DEVBUF);
1413 siba_sprom_read(struct siba_softc *siba, uint16_t *sprom, uint16_t len)
1417 for (i = 0; i < len; i++)
1418 sprom[i] = SIBA_READ_2(siba, SIBA_SPROM_BASE + (i * 2));
1420 siba->siba_spromsize = len;
1425 sprom_check_crc(const uint16_t *sprom, size_t size)
1428 uint8_t crc0, crc1 = 0xff;
1430 crc0 = (sprom[size - 1] & SIBA_SPROM_REV_CRC) >> 8;
1431 for (word = 0; word < size - 1; word++) {
1432 crc1 = siba_crc8(crc1, sprom[word] & 0x00ff);
1433 crc1 = siba_crc8(crc1, (sprom[word] & 0xff00) >> 8);
1435 crc1 = siba_crc8(crc1, sprom[size - 1] & 0x00ff);
1438 return ((crc0 != crc1) ? EPROTO : 0);
1442 siba_crc8(uint8_t crc, uint8_t data)
1444 static const uint8_t ct[] = {
1445 0x00, 0xf7, 0xb9, 0x4e, 0x25, 0xd2, 0x9c, 0x6b,
1446 0x4a, 0xbd, 0xf3, 0x04, 0x6f, 0x98, 0xd6, 0x21,
1447 0x94, 0x63, 0x2d, 0xda, 0xb1, 0x46, 0x08, 0xff,
1448 0xde, 0x29, 0x67, 0x90, 0xfb, 0x0c, 0x42, 0xb5,
1449 0x7f, 0x88, 0xc6, 0x31, 0x5a, 0xad, 0xe3, 0x14,
1450 0x35, 0xc2, 0x8c, 0x7b, 0x10, 0xe7, 0xa9, 0x5e,
1451 0xeb, 0x1c, 0x52, 0xa5, 0xce, 0x39, 0x77, 0x80,
1452 0xa1, 0x56, 0x18, 0xef, 0x84, 0x73, 0x3d, 0xca,
1453 0xfe, 0x09, 0x47, 0xb0, 0xdb, 0x2c, 0x62, 0x95,
1454 0xb4, 0x43, 0x0d, 0xfa, 0x91, 0x66, 0x28, 0xdf,
1455 0x6a, 0x9d, 0xd3, 0x24, 0x4f, 0xb8, 0xf6, 0x01,
1456 0x20, 0xd7, 0x99, 0x6e, 0x05, 0xf2, 0xbc, 0x4b,
1457 0x81, 0x76, 0x38, 0xcf, 0xa4, 0x53, 0x1d, 0xea,
1458 0xcb, 0x3c, 0x72, 0x85, 0xee, 0x19, 0x57, 0xa0,
1459 0x15, 0xe2, 0xac, 0x5b, 0x30, 0xc7, 0x89, 0x7e,
1460 0x5f, 0xa8, 0xe6, 0x11, 0x7a, 0x8d, 0xc3, 0x34,
1461 0xab, 0x5c, 0x12, 0xe5, 0x8e, 0x79, 0x37, 0xc0,
1462 0xe1, 0x16, 0x58, 0xaf, 0xc4, 0x33, 0x7d, 0x8a,
1463 0x3f, 0xc8, 0x86, 0x71, 0x1a, 0xed, 0xa3, 0x54,
1464 0x75, 0x82, 0xcc, 0x3b, 0x50, 0xa7, 0xe9, 0x1e,
1465 0xd4, 0x23, 0x6d, 0x9a, 0xf1, 0x06, 0x48, 0xbf,
1466 0x9e, 0x69, 0x27, 0xd0, 0xbb, 0x4c, 0x02, 0xf5,
1467 0x40, 0xb7, 0xf9, 0x0e, 0x65, 0x92, 0xdc, 0x2b,
1468 0x0a, 0xfd, 0xb3, 0x44, 0x2f, 0xd8, 0x96, 0x61,
1469 0x55, 0xa2, 0xec, 0x1b, 0x70, 0x87, 0xc9, 0x3e,
1470 0x1f, 0xe8, 0xa6, 0x51, 0x3a, 0xcd, 0x83, 0x74,
1471 0xc1, 0x36, 0x78, 0x8f, 0xe4, 0x13, 0x5d, 0xaa,
1472 0x8b, 0x7c, 0x32, 0xc5, 0xae, 0x59, 0x17, 0xe0,
1473 0x2a, 0xdd, 0x93, 0x64, 0x0f, 0xf8, 0xb6, 0x41,
1474 0x60, 0x97, 0xd9, 0x2e, 0x45, 0xb2, 0xfc, 0x0b,
1475 0xbe, 0x49, 0x07, 0xf0, 0x9b, 0x6c, 0x22, 0xd5,
1476 0xf4, 0x03, 0x4d, 0xba, 0xd1, 0x26, 0x68, 0x9f,
1478 return (ct[crc ^ data]);
1481 #define SIBA_LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask))
1482 #define SIBA_OFFSET(offset) \
1483 (((offset) - SIBA_SPROM_BASE) / sizeof(uint16_t))
1484 #define SIBA_SHIFTOUT_SUB(__x, __mask) \
1485 (((__x) & (__mask)) / SIBA_LOWEST_SET_BIT(__mask))
1486 #define SIBA_SHIFTOUT(_var, _offset, _mask) \
1487 out->_var = SIBA_SHIFTOUT_SUB(in[SIBA_OFFSET(_offset)], (_mask))
1488 #define SIBA_SHIFTOUT_4(_var, _offset, _mask, _shift) \
1489 out->_var = ((((uint32_t)in[SIBA_OFFSET((_offset)+2)] << 16 | \
1490 in[SIBA_OFFSET(_offset)]) & (_mask)) >> (_shift))
1493 siba_sprom_r123(struct siba_sprom *out, const uint16_t *in)
1501 loc[0] = SIBA_SPROM3_MAC_80211BG;
1503 loc[0] = SIBA_SPROM1_MAC_80211BG;
1504 loc[1] = SIBA_SPROM1_MAC_ETH;
1505 loc[2] = SIBA_SPROM1_MAC_80211A;
1507 for (i = 0; i < 3; i++) {
1508 v = in[SIBA_OFFSET(loc[0]) + i];
1509 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1512 for (i = 0; i < 3; i++) {
1513 v = in[SIBA_OFFSET(loc[1]) + i];
1514 *(((uint16_t *)out->mac_eth) + i) = htobe16(v);
1516 for (i = 0; i < 3; i++) {
1517 v = in[SIBA_OFFSET(loc[2]) + i];
1518 *(((uint16_t *)out->mac_80211a) + i) = htobe16(v);
1521 SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM1_ETHPHY,
1522 SIBA_SPROM1_ETHPHY_MII_ETH0);
1523 SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM1_ETHPHY,
1524 SIBA_SPROM1_ETHPHY_MII_ETH1);
1525 SIBA_SHIFTOUT(mdio_eth0, SIBA_SPROM1_ETHPHY,
1526 SIBA_SPROM1_ETHPHY_MDIO_ETH0);
1527 SIBA_SHIFTOUT(mdio_eth1, SIBA_SPROM1_ETHPHY,
1528 SIBA_SPROM1_ETHPHY_MDIO_ETH1);
1529 SIBA_SHIFTOUT(brev, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_BREV);
1530 SIBA_SHIFTOUT(ccode, SIBA_SPROM1_BOARDINFO,
1531 SIBA_SPROM1_BOARDINFO_CCODE);
1532 SIBA_SHIFTOUT(ant_a, SIBA_SPROM1_BOARDINFO, SIBA_SPROM1_BOARDINFO_ANTA);
1533 SIBA_SHIFTOUT(ant_bg, SIBA_SPROM1_BOARDINFO,
1534 SIBA_SPROM1_BOARDINFO_ANTBG);
1535 SIBA_SHIFTOUT(pa0b0, SIBA_SPROM1_PA0B0, 0xffff);
1536 SIBA_SHIFTOUT(pa0b1, SIBA_SPROM1_PA0B1, 0xffff);
1537 SIBA_SHIFTOUT(pa0b2, SIBA_SPROM1_PA0B2, 0xffff);
1538 SIBA_SHIFTOUT(pa1b0, SIBA_SPROM1_PA1B0, 0xffff);
1539 SIBA_SHIFTOUT(pa1b1, SIBA_SPROM1_PA1B1, 0xffff);
1540 SIBA_SHIFTOUT(pa1b2, SIBA_SPROM1_PA1B2, 0xffff);
1541 SIBA_SHIFTOUT(gpio0, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P0);
1542 SIBA_SHIFTOUT(gpio1, SIBA_SPROM1_GPIOA, SIBA_SPROM1_GPIOA_P1);
1543 SIBA_SHIFTOUT(gpio2, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P2);
1544 SIBA_SHIFTOUT(gpio3, SIBA_SPROM1_GPIOB, SIBA_SPROM1_GPIOB_P3);
1546 SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_A);
1547 SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM1_MAXPWR, SIBA_SPROM1_MAXPWR_BG);
1548 SIBA_SHIFTOUT(tssi_a, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_A);
1549 SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM1_TSSI, SIBA_SPROM1_TSSI_BG);
1550 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM1_BFLOW, 0xffff);
1552 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM2_BFHIGH, 0xffff);
1555 gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_BG, 0);
1556 out->again.ghz24.a0 = out->again.ghz24.a1 = gain;
1557 out->again.ghz24.a2 = out->again.ghz24.a3 = gain;
1558 gain = siba_sprom_r123_antgain(out->rev, in, SIBA_SPROM1_AGAIN_A, 8);
1559 out->again.ghz5.a0 = out->again.ghz5.a1 = gain;
1560 out->again.ghz5.a2 = out->again.ghz5.a3 = gain;
1564 siba_sprom_r45(struct siba_sprom *out, const uint16_t *in)
1568 uint16_t mac_80211bg_offset;
1571 mac_80211bg_offset = SIBA_SPROM4_MAC_80211BG;
1573 mac_80211bg_offset = SIBA_SPROM5_MAC_80211BG;
1574 for (i = 0; i < 3; i++) {
1575 v = in[SIBA_OFFSET(mac_80211bg_offset) + i];
1576 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1578 SIBA_SHIFTOUT(mii_eth0, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET0A);
1579 SIBA_SHIFTOUT(mii_eth1, SIBA_SPROM4_ETHPHY, SIBA_SPROM4_ETHPHY_ET1A);
1580 if (out->rev == 4) {
1581 SIBA_SHIFTOUT(ccode, SIBA_SPROM4_CCODE, 0xffff);
1582 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM4_BFLOW, 0xffff);
1583 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM4_BFHIGH, 0xffff);
1585 SIBA_SHIFTOUT(ccode, SIBA_SPROM5_CCODE, 0xffff);
1586 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM5_BFLOW, 0xffff);
1587 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM5_BFHIGH, 0xffff);
1589 SIBA_SHIFTOUT(ant_a, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_A);
1590 SIBA_SHIFTOUT(ant_bg, SIBA_SPROM4_ANTAVAIL, SIBA_SPROM4_ANTAVAIL_BG);
1591 SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_MAXP_BG_MASK);
1592 SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM4_MAXP_BG, SIBA_SPROM4_TSSI_BG);
1593 SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_MAXP_A_MASK);
1594 SIBA_SHIFTOUT(tssi_a, SIBA_SPROM4_MAXP_A, SIBA_SPROM4_TSSI_A);
1595 if (out->rev == 4) {
1596 SIBA_SHIFTOUT(gpio0, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P0);
1597 SIBA_SHIFTOUT(gpio1, SIBA_SPROM4_GPIOA, SIBA_SPROM4_GPIOA_P1);
1598 SIBA_SHIFTOUT(gpio2, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P2);
1599 SIBA_SHIFTOUT(gpio3, SIBA_SPROM4_GPIOB, SIBA_SPROM4_GPIOB_P3);
1601 SIBA_SHIFTOUT(gpio0, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P0);
1602 SIBA_SHIFTOUT(gpio1, SIBA_SPROM5_GPIOA, SIBA_SPROM5_GPIOA_P1);
1603 SIBA_SHIFTOUT(gpio2, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P2);
1604 SIBA_SHIFTOUT(gpio3, SIBA_SPROM5_GPIOB, SIBA_SPROM5_GPIOB_P3);
1608 SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN0);
1609 SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM4_AGAIN01, SIBA_SPROM4_AGAIN1);
1610 SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN2);
1611 SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM4_AGAIN23, SIBA_SPROM4_AGAIN3);
1612 bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5));
1616 siba_sprom_r8(struct siba_sprom *out, const uint16_t *in)
1621 for (i = 0; i < 3; i++) {
1622 v = in[SIBA_OFFSET(SIBA_SPROM8_MAC_80211BG) + i];
1623 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1625 SIBA_SHIFTOUT(ccode, SIBA_SPROM8_CCODE, 0xffff);
1626 SIBA_SHIFTOUT(bf_lo, SIBA_SPROM8_BFLOW, 0xffff);
1627 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM8_BFHIGH, 0xffff);
1628 SIBA_SHIFTOUT(bf2_lo, SIBA_SPROM8_BFL2LO, 0xffff);
1629 SIBA_SHIFTOUT(bf2_hi, SIBA_SPROM8_BFL2HI, 0xffff);
1630 SIBA_SHIFTOUT(ant_a, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_A);
1631 SIBA_SHIFTOUT(ant_bg, SIBA_SPROM8_ANTAVAIL, SIBA_SPROM8_ANTAVAIL_BG);
1632 SIBA_SHIFTOUT(maxpwr_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_MAXP_BG_MASK);
1633 SIBA_SHIFTOUT(tssi_bg, SIBA_SPROM8_MAXP_BG, SIBA_SPROM8_TSSI_BG);
1634 SIBA_SHIFTOUT(maxpwr_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_MAXP_A_MASK);
1635 SIBA_SHIFTOUT(tssi_a, SIBA_SPROM8_MAXP_A, SIBA_SPROM8_TSSI_A);
1636 SIBA_SHIFTOUT(maxpwr_ah, SIBA_SPROM8_MAXP_AHL,
1637 SIBA_SPROM8_MAXP_AH_MASK);
1638 SIBA_SHIFTOUT(maxpwr_al, SIBA_SPROM8_MAXP_AHL,
1639 SIBA_SPROM8_MAXP_AL_MASK);
1640 SIBA_SHIFTOUT(gpio0, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P0);
1641 SIBA_SHIFTOUT(gpio1, SIBA_SPROM8_GPIOA, SIBA_SPROM8_GPIOA_P1);
1642 SIBA_SHIFTOUT(gpio2, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P2);
1643 SIBA_SHIFTOUT(gpio3, SIBA_SPROM8_GPIOB, SIBA_SPROM8_GPIOB_P3);
1644 SIBA_SHIFTOUT(tri2g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI2G);
1645 SIBA_SHIFTOUT(tri5g, SIBA_SPROM8_TRI25G, SIBA_SPROM8_TRI5G);
1646 SIBA_SHIFTOUT(tri5gl, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GL);
1647 SIBA_SHIFTOUT(tri5gh, SIBA_SPROM8_TRI5GHL, SIBA_SPROM8_TRI5GH);
1648 SIBA_SHIFTOUT(rxpo2g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO2G);
1649 SIBA_SHIFTOUT(rxpo5g, SIBA_SPROM8_RXPO, SIBA_SPROM8_RXPO5G);
1650 SIBA_SHIFTOUT(rssismf2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMF2G);
1651 SIBA_SHIFTOUT(rssismc2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISMC2G);
1652 SIBA_SHIFTOUT(rssisav2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_RSSISAV2G);
1653 SIBA_SHIFTOUT(bxa2g, SIBA_SPROM8_RSSIPARM2G, SIBA_SPROM8_BXA2G);
1654 SIBA_SHIFTOUT(rssismf5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMF5G);
1655 SIBA_SHIFTOUT(rssismc5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISMC5G);
1656 SIBA_SHIFTOUT(rssisav5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_RSSISAV5G);
1657 SIBA_SHIFTOUT(bxa5g, SIBA_SPROM8_RSSIPARM5G, SIBA_SPROM8_BXA5G);
1659 SIBA_SHIFTOUT(pa0b0, SIBA_SPROM8_PA0B0, 0xffff);
1660 SIBA_SHIFTOUT(pa0b1, SIBA_SPROM8_PA0B1, 0xffff);
1661 SIBA_SHIFTOUT(pa0b2, SIBA_SPROM8_PA0B2, 0xffff);
1662 SIBA_SHIFTOUT(pa1b0, SIBA_SPROM8_PA1B0, 0xffff);
1663 SIBA_SHIFTOUT(pa1b1, SIBA_SPROM8_PA1B1, 0xffff);
1664 SIBA_SHIFTOUT(pa1b2, SIBA_SPROM8_PA1B2, 0xffff);
1665 SIBA_SHIFTOUT(pa1lob0, SIBA_SPROM8_PA1LOB0, 0xffff);
1666 SIBA_SHIFTOUT(pa1lob1, SIBA_SPROM8_PA1LOB1, 0xffff);
1667 SIBA_SHIFTOUT(pa1lob2, SIBA_SPROM8_PA1LOB2, 0xffff);
1668 SIBA_SHIFTOUT(pa1hib0, SIBA_SPROM8_PA1HIB0, 0xffff);
1669 SIBA_SHIFTOUT(pa1hib1, SIBA_SPROM8_PA1HIB1, 0xffff);
1670 SIBA_SHIFTOUT(pa1hib2, SIBA_SPROM8_PA1HIB2, 0xffff);
1671 SIBA_SHIFTOUT(cck2gpo, SIBA_SPROM8_CCK2GPO, 0xffff);
1673 SIBA_SHIFTOUT_4(ofdm2gpo, SIBA_SPROM8_OFDM2GPO, 0xffffffff, 0);
1674 SIBA_SHIFTOUT_4(ofdm5glpo, SIBA_SPROM8_OFDM5GLPO, 0xffffffff, 0);
1675 SIBA_SHIFTOUT_4(ofdm5gpo, SIBA_SPROM8_OFDM5GPO, 0xffffffff, 0);
1676 SIBA_SHIFTOUT_4(ofdm5ghpo, SIBA_SPROM8_OFDM5GHPO, 0xffffffff, 0);
1679 SIBA_SHIFTOUT(again.ghz24.a0, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN0);
1680 SIBA_SHIFTOUT(again.ghz24.a1, SIBA_SPROM8_AGAIN01, SIBA_SPROM8_AGAIN1);
1681 SIBA_SHIFTOUT(again.ghz24.a2, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN2);
1682 SIBA_SHIFTOUT(again.ghz24.a3, SIBA_SPROM8_AGAIN23, SIBA_SPROM8_AGAIN3);
1683 bcopy(&out->again.ghz24, &out->again.ghz5, sizeof(out->again.ghz5));
1687 siba_sprom_r123_antgain(uint8_t sprom_revision, const uint16_t *in,
1688 uint16_t mask, uint16_t shift)
1693 v = in[SIBA_OFFSET(SIBA_SPROM1_AGAIN)];
1694 gain = (v & mask) >> shift;
1695 gain = (gain == 0xff) ? 2 : (sprom_revision == 1) ? gain << 2 :
1696 ((gain & 0xc0) >> 6) | ((gain & 0x3f) << 2);
1698 return ((int8_t)gain);
1701 #undef SIBA_LOWEST_SET_BIT
1703 #undef SIBA_SHIFTOUT_SUB
1704 #undef SIBA_SHIFTOUT
1707 siba_powerdown(device_t dev)
1709 struct siba_dev_softc *sd = device_get_ivars(dev);
1710 struct siba_softc *siba = sd->sd_bus;
1712 return (siba_powerdown_sub(siba));
1716 siba_powerdown_sub(struct siba_softc *siba)
1718 struct siba_cc *scc;
1720 if (siba->siba_type == SIBA_TYPE_SSB)
1723 scc = &siba->siba_cc;
1724 if (scc->scc_dev == NULL || scc->scc_dev->sd_id.sd_rev < 5)
1726 siba_cc_clock(scc, SIBA_CLOCK_SLOW);
1727 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
1732 siba_pcicore_init(struct siba_pci *spc)
1734 struct siba_dev_softc *sd = spc->spc_dev;
1735 struct siba_softc *siba;
1741 if (!siba_dev_isup_sub(sd))
1742 siba_dev_up_sub(sd, 0);
1744 KASSERT(spc->spc_hostmode == 0,
1745 ("%s:%d: hostmode", __func__, __LINE__));
1746 /* disable PCI interrupt */
1747 siba_write_4_sub(spc->spc_dev, SIBA_INTR_MASK, 0);
1751 siba_dev_isup(device_t dev)
1753 struct siba_dev_softc *sd = device_get_ivars(dev);
1755 return (siba_dev_isup_sub(sd));
1759 siba_dev_isup_sub(struct siba_dev_softc *sd)
1761 uint32_t reject, val;
1763 reject = siba_tmslow_reject_bitmask(sd);
1764 val = siba_read_4_sub(sd, SIBA_TGSLOW);
1765 val &= SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_RESET | reject;
1767 return (val == SIBA_TGSLOW_CLOCK);
1771 siba_dev_up(device_t dev, uint32_t flags)
1773 struct siba_dev_softc *sd = device_get_ivars(dev);
1775 siba_dev_up_sub(sd, flags);
1779 siba_dev_up_sub(struct siba_dev_softc *sd, uint32_t flags)
1783 siba_dev_down_sub(sd, flags);
1784 siba_write_4_sub(sd, SIBA_TGSLOW,
1785 SIBA_TGSLOW_RESET | SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
1786 siba_read_4_sub(sd, SIBA_TGSLOW);
1789 if (siba_read_4_sub(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR)
1790 siba_write_4_sub(sd, SIBA_TGSHIGH, 0);
1792 val = siba_read_4_sub(sd, SIBA_IAS);
1793 if (val & (SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT)) {
1794 val &= ~(SIBA_IAS_INBAND_ERR | SIBA_IAS_TIMEOUT);
1795 siba_write_4_sub(sd, SIBA_IAS, val);
1798 siba_write_4_sub(sd, SIBA_TGSLOW,
1799 SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
1800 siba_read_4_sub(sd, SIBA_TGSLOW);
1803 siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags);
1804 siba_read_4_sub(sd, SIBA_TGSLOW);
1809 siba_tmslow_reject_bitmask(struct siba_dev_softc *sd)
1811 uint32_t rev = siba_read_4_sub(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV;
1814 case SIBA_IDLOW_SSBREV_22:
1815 return (SIBA_TGSLOW_REJECT_22);
1816 case SIBA_IDLOW_SSBREV_23:
1817 return (SIBA_TGSLOW_REJECT_23);
1818 case SIBA_IDLOW_SSBREV_24:
1819 case SIBA_IDLOW_SSBREV_25:
1820 case SIBA_IDLOW_SSBREV_26:
1821 case SIBA_IDLOW_SSBREV_27:
1822 return (SIBA_TGSLOW_REJECT_23);
1825 ("%s:%d: unknown backplane rev %#x\n",
1826 __func__, __LINE__, rev));
1828 return (SIBA_TGSLOW_REJECT_22 | SIBA_TGSLOW_REJECT_23);
1832 siba_dev_down(device_t dev, uint32_t flags)
1834 struct siba_dev_softc *sd = device_get_ivars(dev);
1836 siba_dev_down_sub(sd, flags);
1840 siba_dev_down_sub(struct siba_dev_softc *sd, uint32_t flags)
1842 struct siba_softc *siba = sd->sd_bus;
1843 uint32_t reject, val;
1846 if (siba_read_4_sub(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET)
1849 reject = siba_tmslow_reject_bitmask(sd);
1850 siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK);
1852 for (i = 0; i < 1000; i++) {
1853 val = siba_read_4_sub(sd, SIBA_TGSLOW);
1858 if ((val & reject) == 0) {
1859 device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
1860 reject, SIBA_TGSLOW);
1862 for (i = 0; i < 1000; i++) {
1863 val = siba_read_4_sub(sd, SIBA_TGSHIGH);
1864 if (!(val & SIBA_TGSHIGH_BUSY))
1868 if ((val & SIBA_TGSHIGH_BUSY) != 0) {
1869 device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
1870 SIBA_TGSHIGH_BUSY, SIBA_TGSHIGH);
1873 siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_FGC | SIBA_TGSLOW_CLOCK |
1874 reject | SIBA_TGSLOW_RESET | flags);
1875 siba_read_4_sub(sd, SIBA_TGSLOW);
1877 siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags);
1878 siba_read_4_sub(sd, SIBA_TGSLOW);
1883 siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd)
1885 struct siba_dev_softc *psd = spc->spc_dev;
1886 struct siba_softc *siba = psd->sd_bus;
1889 if (psd->sd_id.sd_device == SIBA_DEVID_PCI) {
1890 siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2,
1891 siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2) |
1892 SIBA_PCICORE_SBTOPCI_PREF | SIBA_PCICORE_SBTOPCI_BURST);
1894 if (psd->sd_id.sd_rev < 5) {
1895 tmp = siba_read_4_sub(psd, SIBA_IMCFGLO);
1896 tmp &= ~SIBA_IMCFGLO_SERTO;
1897 tmp = (tmp | 2) & ~SIBA_IMCFGLO_REQTO;
1898 tmp |= 3 << 4 /* SIBA_IMCFGLO_REQTO_SHIFT */;
1899 siba_write_4_sub(psd, SIBA_IMCFGLO, tmp);
1901 /* broadcast value */
1902 sd = (siba->siba_cc.scc_dev != NULL) ?
1903 siba->siba_cc.scc_dev : siba->siba_pci.spc_dev;
1905 siba_write_4_sub(sd, SIBA_PCICORE_BCAST_ADDR,
1907 siba_read_4_sub(sd, SIBA_PCICORE_BCAST_ADDR);
1908 siba_write_4_sub(sd,
1909 SIBA_PCICORE_BCAST_DATA, 0);
1910 siba_read_4_sub(sd, SIBA_PCICORE_BCAST_DATA);
1912 } else if (psd->sd_id.sd_rev >= 11) {
1913 tmp = siba_pcicore_read_4(spc, SIBA_PCICORE_SBTOPCI2);
1914 tmp |= SIBA_PCICORE_SBTOPCI_MRM;
1915 siba_pcicore_write_4(spc, SIBA_PCICORE_SBTOPCI2, tmp);
1918 KASSERT(psd->sd_id.sd_device == SIBA_DEVID_PCIE, ("only PCIE"));
1919 if ((psd->sd_id.sd_rev == 0) || (psd->sd_id.sd_rev == 1))
1920 siba_pcie_write(spc, 0x4,
1921 siba_pcie_read(spc, 0x4) | 0x8);
1922 if (psd->sd_id.sd_rev == 0) {
1923 siba_pcie_mdio_write(spc, 0x1f, 2, 0x8128); /* Timer */
1924 siba_pcie_mdio_write(spc, 0x1f, 6, 0x0100); /* CDR */
1925 siba_pcie_mdio_write(spc, 0x1f, 7, 0x1466); /* CDR BW */
1926 } else if (psd->sd_id.sd_rev == 1)
1927 siba_pcie_write(spc, 0x100,
1928 siba_pcie_read(spc, 0x100) | 0x40);
1930 spc->spc_inited = 1;
1934 siba_pcicore_intr(device_t dev)
1936 struct siba_dev_softc *sd = device_get_ivars(dev);
1937 struct siba_softc *siba = sd->sd_bus;
1938 struct siba_pci *spc = &siba->siba_pci;
1939 struct siba_dev_softc *psd = spc->spc_dev;
1942 if (siba->siba_type != SIBA_TYPE_PCI || !psd)
1945 KASSERT(siba == psd->sd_bus, ("different pointers"));
1947 /* enable interrupts */
1948 if (siba->siba_dev != NULL &&
1949 (psd->sd_id.sd_rev >= 6 ||
1950 psd->sd_id.sd_device == SIBA_DEVID_PCIE)) {
1951 tmp = pci_read_config(siba->siba_dev, SIBA_IRQMASK, 4);
1952 tmp |= (1 << sd->sd_coreidx) << 8;
1953 pci_write_config(siba->siba_dev, SIBA_IRQMASK, tmp, 4);
1955 tmp = siba_read_4_sub(sd, SIBA_TPS);
1956 tmp &= SIBA_TPS_BPFLAG;
1957 siba_write_4_sub(psd, SIBA_INTR_MASK,
1958 siba_read_4_sub(psd, SIBA_INTR_MASK) | (1 << tmp));
1962 if (spc->spc_inited == 0)
1963 siba_pcicore_setup(spc, sd);
1967 siba_pcicore_read_4(struct siba_pci *spc, uint16_t offset)
1970 return (siba_read_4_sub(spc->spc_dev, offset));
1974 siba_pcicore_write_4(struct siba_pci *spc, uint16_t offset, uint32_t value)
1977 siba_write_4_sub(spc->spc_dev, offset, value);
1981 siba_pcie_read(struct siba_pci *spc, uint32_t address)
1984 siba_pcicore_write_4(spc, 0x130, address);
1985 return (siba_pcicore_read_4(spc, 0x134));
1989 siba_pcie_write(struct siba_pci *spc, uint32_t address, uint32_t data)
1992 siba_pcicore_write_4(spc, 0x130, address);
1993 siba_pcicore_write_4(spc, 0x134, data);
1997 siba_pcie_mdio_write(struct siba_pci *spc, uint8_t device, uint8_t address,
2002 siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0x80 | 0x2);
2003 siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_DATA,
2004 (1 << 30) | (1 << 28) |
2005 ((uint32_t)device << 22) | ((uint32_t)address << 18) |
2008 for (i = 0; i < 10; i++) {
2009 if (siba_pcicore_read_4(spc, SIBA_PCICORE_MDIO_CTL) & 0x100)
2013 siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0);
2017 siba_dma_translation(device_t dev)
2020 struct siba_dev_softc *sd = device_get_ivars(dev);
2021 struct siba_softc *siba = sd->sd_bus;
2023 KASSERT(siba->siba_type == SIBA_TYPE_PCI,
2024 ("unsupported bustype %d\n", siba->siba_type));
2026 return (SIBA_PCI_DMA);
2030 siba_barrier(device_t dev, int flags)
2032 struct siba_dev_softc *sd = device_get_ivars(dev);
2033 struct siba_softc *siba = sd->sd_bus;
2035 SIBA_BARRIER(siba, flags);
2039 siba_cc_suspend(struct siba_cc *scc)
2042 siba_cc_clock(scc, SIBA_CLOCK_SLOW);
2046 siba_cc_resume(struct siba_cc *scc)
2049 siba_cc_power_init(scc);
2050 siba_cc_clock(scc, SIBA_CLOCK_FAST);
2054 siba_core_suspend(struct siba_softc *siba)
2057 siba_cc_suspend(&siba->siba_cc);
2058 siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
2063 siba_core_resume(struct siba_softc *siba)
2066 siba->siba_pci.spc_inited = 0;
2067 siba->siba_curdev = NULL;
2069 siba_powerup_sub(siba, 0);
2070 /* XXX setup H/W for PCMCIA??? */
2071 siba_cc_resume(&siba->siba_cc);
2072 siba_powerdown_sub(siba);
2078 siba_cc_regctl_setmask(struct siba_cc *cc, uint32_t offset, uint32_t mask,
2082 SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR);
2083 SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_ADDR, offset);
2084 SIBA_CC_READ32(cc, SIBA_CC_REGCTL_ADDR);
2085 SIBA_CC_WRITE32(cc, SIBA_CC_REGCTL_DATA,
2086 (SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA) & mask) | set);
2087 SIBA_CC_READ32(cc, SIBA_CC_REGCTL_DATA);
2091 siba_cc_pmu_set_ldovolt(device_t dev, int id, uint32_t volt)
2093 struct siba_dev_softc *sd = device_get_ivars(dev);
2094 struct siba_softc *siba = sd->sd_bus;
2095 struct siba_cc *scc = &siba->siba_cc;
2096 uint32_t *p = NULL, info[5][3] = {
2104 if (siba->siba_chipid == 0x4312) {
2105 if (id != SIBA_LDO_PAREF)
2108 siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2109 (volt & p[2]) << p[1]);
2112 if (siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354) {
2114 case SIBA_LDO_PAREF:
2117 case SIBA_LDO_VOLT1:
2120 case SIBA_LDO_VOLT2:
2123 case SIBA_LDO_VOLT3:
2128 ("%s: unsupported voltage ID %#x", __func__, id));
2131 siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2132 (volt & p[2]) << p[1]);
2137 siba_cc_pmu_set_ldoparef(device_t dev, uint8_t on)
2139 struct siba_dev_softc *sd = device_get_ivars(dev);
2140 struct siba_softc *siba = sd->sd_bus;
2141 struct siba_cc *scc = &siba->siba_cc;
2144 ldo = ((siba->siba_chipid == 0x4312) ? SIBA_CC_PMU_4312_PA_REF :
2145 ((siba->siba_chipid == 0x4328) ? SIBA_CC_PMU_4328_PA_REF :
2146 ((siba->siba_chipid == 0x5354) ? SIBA_CC_PMU_5354_PA_REF : -1)));
2151 SIBA_CC_SET32(scc, SIBA_CC_PMU_MINRES, 1 << ldo);
2153 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, ~(1 << ldo));
2154 SIBA_CC_READ32(scc, SIBA_CC_PMU_MINRES);
2158 siba_read_sprom(device_t dev, device_t child, int which, uintptr_t *result)
2160 struct siba_dev_softc *sd = device_get_ivars(child);
2161 struct siba_softc *siba = sd->sd_bus;
2164 case SIBA_SPROMVAR_REV:
2165 *result = siba->siba_sprom.rev;
2167 case SIBA_SPROMVAR_MAC_80211BG:
2168 *((uint8_t **) result) = siba->siba_sprom.mac_80211bg;
2170 case SIBA_SPROMVAR_MAC_ETH:
2171 *((uint8_t **) result) = siba->siba_sprom.mac_eth;
2173 case SIBA_SPROMVAR_MAC_80211A:
2174 *((uint8_t **) result) = siba->siba_sprom.mac_80211a;
2176 case SIBA_SPROMVAR_MII_ETH0:
2177 *result = siba->siba_sprom.mii_eth0;
2179 case SIBA_SPROMVAR_MII_ETH1:
2180 *result = siba->siba_sprom.mii_eth1;
2182 case SIBA_SPROMVAR_MDIO_ETH0:
2183 *result = siba->siba_sprom.mdio_eth0;
2185 case SIBA_SPROMVAR_MDIO_ETH1:
2186 *result = siba->siba_sprom.mdio_eth1;
2188 case SIBA_SPROMVAR_BREV:
2189 *result = siba->siba_sprom.brev;
2191 case SIBA_SPROMVAR_CCODE:
2192 *result = siba->siba_sprom.ccode;
2194 case SIBA_SPROMVAR_ANT_A:
2195 *result = siba->siba_sprom.ant_a;
2197 case SIBA_SPROMVAR_ANT_BG:
2198 *result = siba->siba_sprom.ant_bg;
2200 case SIBA_SPROMVAR_PA0B0:
2201 *result = siba->siba_sprom.pa0b0;
2203 case SIBA_SPROMVAR_PA0B1:
2204 *result = siba->siba_sprom.pa0b1;
2206 case SIBA_SPROMVAR_PA0B2:
2207 *result = siba->siba_sprom.pa0b2;
2209 case SIBA_SPROMVAR_PA1B0:
2210 *result = siba->siba_sprom.pa1b0;
2212 case SIBA_SPROMVAR_PA1B1:
2213 *result = siba->siba_sprom.pa1b1;
2215 case SIBA_SPROMVAR_PA1B2:
2216 *result = siba->siba_sprom.pa1b2;
2218 case SIBA_SPROMVAR_PA1LOB0:
2219 *result = siba->siba_sprom.pa1lob0;
2221 case SIBA_SPROMVAR_PA1LOB1:
2222 *result = siba->siba_sprom.pa1lob1;
2224 case SIBA_SPROMVAR_PA1LOB2:
2225 *result = siba->siba_sprom.pa1lob2;
2227 case SIBA_SPROMVAR_PA1HIB0:
2228 *result = siba->siba_sprom.pa1hib0;
2230 case SIBA_SPROMVAR_PA1HIB1:
2231 *result = siba->siba_sprom.pa1hib1;
2233 case SIBA_SPROMVAR_PA1HIB2:
2234 *result = siba->siba_sprom.pa1hib2;
2236 case SIBA_SPROMVAR_GPIO0:
2237 *result = siba->siba_sprom.gpio0;
2239 case SIBA_SPROMVAR_GPIO1:
2240 *result = siba->siba_sprom.gpio1;
2242 case SIBA_SPROMVAR_GPIO2:
2243 *result = siba->siba_sprom.gpio2;
2245 case SIBA_SPROMVAR_GPIO3:
2246 *result = siba->siba_sprom.gpio3;
2248 case SIBA_SPROMVAR_MAXPWR_AL:
2249 *result = siba->siba_sprom.maxpwr_al;
2251 case SIBA_SPROMVAR_MAXPWR_A:
2252 *result = siba->siba_sprom.maxpwr_a;
2254 case SIBA_SPROMVAR_MAXPWR_AH:
2255 *result = siba->siba_sprom.maxpwr_ah;
2257 case SIBA_SPROMVAR_MAXPWR_BG:
2258 *result = siba->siba_sprom.maxpwr_bg;
2260 case SIBA_SPROMVAR_RXPO2G:
2261 *result = siba->siba_sprom.rxpo2g;
2263 case SIBA_SPROMVAR_RXPO5G:
2264 *result = siba->siba_sprom.rxpo5g;
2266 case SIBA_SPROMVAR_TSSI_A:
2267 *result = siba->siba_sprom.tssi_a;
2269 case SIBA_SPROMVAR_TSSI_BG:
2270 *result = siba->siba_sprom.tssi_bg;
2272 case SIBA_SPROMVAR_TRI2G:
2273 *result = siba->siba_sprom.tri2g;
2275 case SIBA_SPROMVAR_TRI5GL:
2276 *result = siba->siba_sprom.tri5gl;
2278 case SIBA_SPROMVAR_TRI5G:
2279 *result = siba->siba_sprom.tri5g;
2281 case SIBA_SPROMVAR_TRI5GH:
2282 *result = siba->siba_sprom.tri5gh;
2284 case SIBA_SPROMVAR_RSSISAV2G:
2285 *result = siba->siba_sprom.rssisav2g;
2287 case SIBA_SPROMVAR_RSSISMC2G:
2288 *result = siba->siba_sprom.rssismc2g;
2290 case SIBA_SPROMVAR_RSSISMF2G:
2291 *result = siba->siba_sprom.rssismf2g;
2293 case SIBA_SPROMVAR_BXA2G:
2294 *result = siba->siba_sprom.bxa2g;
2296 case SIBA_SPROMVAR_RSSISAV5G:
2297 *result = siba->siba_sprom.rssisav5g;
2299 case SIBA_SPROMVAR_RSSISMC5G:
2300 *result = siba->siba_sprom.rssismc5g;
2302 case SIBA_SPROMVAR_RSSISMF5G:
2303 *result = siba->siba_sprom.rssismf5g;
2305 case SIBA_SPROMVAR_BXA5G:
2306 *result = siba->siba_sprom.bxa5g;
2308 case SIBA_SPROMVAR_CCK2GPO:
2309 *result = siba->siba_sprom.cck2gpo;
2311 case SIBA_SPROMVAR_OFDM2GPO:
2312 *result = siba->siba_sprom.ofdm2gpo;
2314 case SIBA_SPROMVAR_OFDM5GLPO:
2315 *result = siba->siba_sprom.ofdm5glpo;
2317 case SIBA_SPROMVAR_OFDM5GPO:
2318 *result = siba->siba_sprom.ofdm5gpo;
2320 case SIBA_SPROMVAR_OFDM5GHPO:
2321 *result = siba->siba_sprom.ofdm5ghpo;
2323 case SIBA_SPROMVAR_BF_LO:
2324 *result = siba->siba_sprom.bf_lo;
2326 case SIBA_SPROMVAR_BF_HI:
2327 *result = siba->siba_sprom.bf_hi;
2329 case SIBA_SPROMVAR_BF2_LO:
2330 *result = siba->siba_sprom.bf2_lo;
2332 case SIBA_SPROMVAR_BF2_HI:
2333 *result = siba->siba_sprom.bf2_hi;
2342 siba_write_sprom(device_t dev, device_t child, int which, uintptr_t value)
2344 struct siba_dev_softc *sd = device_get_ivars(child);
2345 struct siba_softc *siba = sd->sd_bus;
2348 case SIBA_SPROMVAR_REV:
2349 siba->siba_sprom.rev = value;
2351 case SIBA_SPROMVAR_MII_ETH0:
2352 siba->siba_sprom.mii_eth0 = value;
2354 case SIBA_SPROMVAR_MII_ETH1:
2355 siba->siba_sprom.mii_eth1 = value;
2357 case SIBA_SPROMVAR_MDIO_ETH0:
2358 siba->siba_sprom.mdio_eth0 = value;
2360 case SIBA_SPROMVAR_MDIO_ETH1:
2361 siba->siba_sprom.mdio_eth1 = value;
2363 case SIBA_SPROMVAR_BREV:
2364 siba->siba_sprom.brev = value;
2366 case SIBA_SPROMVAR_CCODE:
2367 siba->siba_sprom.ccode = value;
2369 case SIBA_SPROMVAR_ANT_A:
2370 siba->siba_sprom.ant_a = value;
2372 case SIBA_SPROMVAR_ANT_BG:
2373 siba->siba_sprom.ant_bg = value;
2375 case SIBA_SPROMVAR_PA0B0:
2376 siba->siba_sprom.pa0b0 = value;
2378 case SIBA_SPROMVAR_PA0B1:
2379 siba->siba_sprom.pa0b1 = value;
2381 case SIBA_SPROMVAR_PA0B2:
2382 siba->siba_sprom.pa0b2 = value;
2384 case SIBA_SPROMVAR_PA1B0:
2385 siba->siba_sprom.pa1b0 = value;
2387 case SIBA_SPROMVAR_PA1B1:
2388 siba->siba_sprom.pa1b1 = value;
2390 case SIBA_SPROMVAR_PA1B2:
2391 siba->siba_sprom.pa1b2 = value;
2393 case SIBA_SPROMVAR_PA1LOB0:
2394 siba->siba_sprom.pa1lob0 = value;
2396 case SIBA_SPROMVAR_PA1LOB1:
2397 siba->siba_sprom.pa1lob1 = value;
2399 case SIBA_SPROMVAR_PA1LOB2:
2400 siba->siba_sprom.pa1lob2 = value;
2402 case SIBA_SPROMVAR_PA1HIB0:
2403 siba->siba_sprom.pa1hib0 = value;
2405 case SIBA_SPROMVAR_PA1HIB1:
2406 siba->siba_sprom.pa1hib1 = value;
2408 case SIBA_SPROMVAR_PA1HIB2:
2409 siba->siba_sprom.pa1hib2 = value;
2411 case SIBA_SPROMVAR_GPIO0:
2412 siba->siba_sprom.gpio0 = value;
2414 case SIBA_SPROMVAR_GPIO1:
2415 siba->siba_sprom.gpio1 = value;
2417 case SIBA_SPROMVAR_GPIO2:
2418 siba->siba_sprom.gpio2 = value;
2420 case SIBA_SPROMVAR_GPIO3:
2421 siba->siba_sprom.gpio3 = value;
2423 case SIBA_SPROMVAR_MAXPWR_AL:
2424 siba->siba_sprom.maxpwr_al = value;
2426 case SIBA_SPROMVAR_MAXPWR_A:
2427 siba->siba_sprom.maxpwr_a = value;
2429 case SIBA_SPROMVAR_MAXPWR_AH:
2430 siba->siba_sprom.maxpwr_ah = value;
2432 case SIBA_SPROMVAR_MAXPWR_BG:
2433 siba->siba_sprom.maxpwr_bg = value;
2435 case SIBA_SPROMVAR_RXPO2G:
2436 siba->siba_sprom.rxpo2g = value;
2438 case SIBA_SPROMVAR_RXPO5G:
2439 siba->siba_sprom.rxpo5g = value;
2441 case SIBA_SPROMVAR_TSSI_A:
2442 siba->siba_sprom.tssi_a = value;
2444 case SIBA_SPROMVAR_TSSI_BG:
2445 siba->siba_sprom.tssi_bg = value;
2447 case SIBA_SPROMVAR_TRI2G:
2448 siba->siba_sprom.tri2g = value;
2450 case SIBA_SPROMVAR_TRI5GL:
2451 siba->siba_sprom.tri5gl = value;
2453 case SIBA_SPROMVAR_TRI5G:
2454 siba->siba_sprom.tri5g = value;
2456 case SIBA_SPROMVAR_TRI5GH:
2457 siba->siba_sprom.tri5gh = value;
2459 case SIBA_SPROMVAR_RSSISAV2G:
2460 siba->siba_sprom.rssisav2g = value;
2462 case SIBA_SPROMVAR_RSSISMC2G:
2463 siba->siba_sprom.rssismc2g = value;
2465 case SIBA_SPROMVAR_RSSISMF2G:
2466 siba->siba_sprom.rssismf2g = value;
2468 case SIBA_SPROMVAR_BXA2G:
2469 siba->siba_sprom.bxa2g = value;
2471 case SIBA_SPROMVAR_RSSISAV5G:
2472 siba->siba_sprom.rssisav5g = value;
2474 case SIBA_SPROMVAR_RSSISMC5G:
2475 siba->siba_sprom.rssismc5g = value;
2477 case SIBA_SPROMVAR_RSSISMF5G:
2478 siba->siba_sprom.rssismf5g = value;
2480 case SIBA_SPROMVAR_BXA5G:
2481 siba->siba_sprom.bxa5g = value;
2483 case SIBA_SPROMVAR_CCK2GPO:
2484 siba->siba_sprom.cck2gpo = value;
2486 case SIBA_SPROMVAR_OFDM2GPO:
2487 siba->siba_sprom.ofdm2gpo = value;
2489 case SIBA_SPROMVAR_OFDM5GLPO:
2490 siba->siba_sprom.ofdm5glpo = value;
2492 case SIBA_SPROMVAR_OFDM5GPO:
2493 siba->siba_sprom.ofdm5gpo = value;
2495 case SIBA_SPROMVAR_OFDM5GHPO:
2496 siba->siba_sprom.ofdm5ghpo = value;
2498 case SIBA_SPROMVAR_BF_LO:
2499 siba->siba_sprom.bf_lo = value;
2501 case SIBA_SPROMVAR_BF_HI:
2502 siba->siba_sprom.bf_hi = value;
2504 case SIBA_SPROMVAR_BF2_LO:
2505 siba->siba_sprom.bf2_lo = value;
2507 case SIBA_SPROMVAR_BF2_HI:
2508 siba->siba_sprom.bf2_hi = value;
2516 #define SIBA_GPIOCTL 0x06c
2519 siba_gpio_get(device_t dev)
2521 struct siba_dev_softc *sd = device_get_ivars(dev);
2522 struct siba_softc *siba = sd->sd_bus;
2523 struct siba_dev_softc *gpiodev, *pcidev = NULL;
2525 pcidev = siba->siba_pci.spc_dev;
2526 gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
2527 if (gpiodev == NULL)
2529 return (siba_read_4_sub(gpiodev, SIBA_GPIOCTL));
2533 siba_gpio_set(device_t dev, uint32_t value)
2535 struct siba_dev_softc *sd = device_get_ivars(dev);
2536 struct siba_softc *siba = sd->sd_bus;
2537 struct siba_dev_softc *gpiodev, *pcidev = NULL;
2539 pcidev = siba->siba_pci.spc_dev;
2540 gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
2541 if (gpiodev == NULL)
2543 siba_write_4_sub(gpiodev, SIBA_GPIOCTL, value);
2547 siba_fix_imcfglobug(device_t dev)
2549 struct siba_dev_softc *sd = device_get_ivars(dev);
2550 struct siba_softc *siba = sd->sd_bus;
2553 if (siba->siba_pci.spc_dev == NULL)
2555 if (siba->siba_pci.spc_dev->sd_id.sd_device != SIBA_DEVID_PCI ||
2556 siba->siba_pci.spc_dev->sd_id.sd_rev > 5)
2559 tmp = siba_read_4_sub(sd, SIBA_IMCFGLO) &
2560 ~(SIBA_IMCFGLO_REQTO | SIBA_IMCFGLO_SERTO);
2561 switch (siba->siba_type) {
2563 case SIBA_TYPE_PCMCIA:
2570 siba_write_4_sub(sd, SIBA_IMCFGLO, tmp);