kernel/bwn: Replace callout_drain calls. Replace a tsleep by DELAY.
[dragonfly.git] / sys / dev / netif / bwn / siba / siba_core.c
1 /*-
2  * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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.
15  *
16  * NO WARRANTY
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.
28  */
29
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD: head/sys/dev/siba/siba_core.c 257241 2013-10-28 07:29:16Z glebius $");
32
33 /*
34  * the Sonics Silicon Backplane driver.
35  */
36
37 #include "opt_siba.h"
38
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>
46 #include <sys/bus.h>
47 #include <sys/bus_resource.h>
48 #include <sys/bus.h>
49 #include <sys/rman.h>
50 #include <sys/socket.h>
51
52 #include <bus/pci/pcivar.h>
53 #include <bus/pci/pcireg.h>
54
55 #include "siba_ids.h"
56 #include "sibareg.h"
57 #include "sibavar.h"
58
59 #ifdef SIBA_DEBUG
60 enum {
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
68 };
69 #define DPRINTF(siba, m, fmt, ...) do {                 \
70         if (m)                                          \
71                 kprintf(fmt, __VA_ARGS__);              \
72 } while (0)
73 #else
74 #define DPRINTF(siba, m, fmt, ...)
75 #endif
76 #define N(a)                    (sizeof(a) / sizeof(a[0]))
77
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 *,
89                     enum siba_clock);
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,
100                     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,
111                     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,
118                     uint16_t);
119 static void     siba_pci_read_multi_1(struct siba_dev_softc *, void *, size_t,
120                     uint16_t);
121 static void     siba_pci_read_multi_2(struct siba_dev_softc *, void *, size_t,
122                     uint16_t);
123 static void     siba_pci_read_multi_4(struct siba_dev_softc *, void *, size_t,
124                     uint16_t);
125 static void     siba_pci_write_multi_1(struct siba_dev_softc *, const void *,
126                     size_t, uint16_t);
127 static void     siba_pci_write_multi_2(struct siba_dev_softc *, const void *,
128                     size_t, uint16_t);
129 static void     siba_pci_write_multi_4(struct siba_dev_softc *, const void *,
130                     size_t, uint16_t);
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);
145
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,
157 };
158
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;
171
172 int
173 siba_core_attach(struct siba_softc *siba)
174 {
175         struct siba_cc *scc;
176         int error;
177
178         KASSERT(siba->siba_type == SIBA_TYPE_PCI,
179             ("unsupported BUS type (%#x)", siba->siba_type));
180
181         siba->siba_ops = &siba_pci_ops;
182
183         siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 1);
184         siba_scan(siba);
185
186         /* XXX init PCI or PCMCIA host devices */
187
188         siba_powerup_sub(siba, 0);
189
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);
197         }
198
199         error = siba_pci_sprom(siba, &siba->siba_sprom);
200         if (error) {
201                 siba_powerdown_sub(siba);
202                 return (error);
203         }
204
205         siba_pcicore_init(&siba->siba_pci);
206         siba_powerdown_sub(siba);
207
208         return (bus_generic_attach(siba->siba_dev));
209 }
210
211 int
212 siba_core_detach(struct siba_softc *siba)
213 {
214         /* detach & delete all children */
215         device_delete_children(siba->siba_dev);
216         return (0);
217 }
218
219 static void
220 siba_pci_gpio(struct siba_softc *siba, uint32_t what, int on)
221 {
222         uint32_t in, out;
223         uint16_t status;
224
225         if (siba->siba_type != SIBA_TYPE_PCI)
226                 return;
227
228         out = pci_read_config(siba->siba_dev, SIBA_GPIO_OUT, 4);
229         if (on == 0) {
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);
238                 return;
239         }
240
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);
251                         DELAY(1000);
252                 }
253                 if (what & SIBA_GPIO_PLL) {
254                         out &= ~SIBA_GPIO_PLL;
255                         pci_write_config(siba->siba_dev, SIBA_GPIO_OUT, out, 4);
256                         DELAY(5000);
257                 }
258         }
259
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);
263 }
264
265 static void
266 siba_scan(struct siba_softc *siba)
267 {
268         struct siba_dev_softc *sd;
269         uint32_t idhi, tmp;
270         device_t child;
271         int base, dev_i = 0, error, i, is_pcie, n_80211 = 0, n_cc = 0,
272             n_pci = 0;
273
274         KASSERT(siba->siba_type == SIBA_TYPE_PCI,
275             ("unsupported BUS type (%#x)", siba->siba_type));
276
277         siba->siba_ndevs = 0;
278         error = siba_switchcore(siba, 0); /* need the first core */
279         if (error)
280                 return;
281
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,
291                     SIBA_CC_CAPS);
292         } else {
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,
296                             PCIR_REVID, 2);
297                         siba->siba_chippkg = 0;
298                 } else {
299                         siba->siba_chipid = 0x4710;
300                         siba->siba_chiprev = 0;
301                         siba->siba_chippkg = 0;
302                 }
303         }
304         if (siba->siba_ndevs == 0)
305                 siba->siba_ndevs = siba_getncores(siba->siba_dev,
306                     siba->siba_chipid);
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);
311                 return;
312         }
313
314         /* looking basic information about each cores/devices */
315         for (i = 0; i < siba->siba_ndevs; i++) {
316                 error = siba_switchcore(siba, i);
317                 if (error)
318                         return;
319                 sd = &(siba->siba_devs[dev_i]);
320                 idhi = siba_scan_read_4(siba, i, SIBA_IDHIGH);
321                 sd->sd_bus = siba;
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;
326                 sd->sd_coreidx = i;
327
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);
332
333                 switch (sd->sd_id.sd_device) {
334                 case SIBA_DEVID_CHIPCOMMON:
335                         n_cc++;
336                         if (n_cc > 1) {
337                                 device_printf(siba->siba_dev,
338                                     "warn: multiple ChipCommon\n");
339                                 break;
340                         }
341                         siba->siba_cc.scc_dev = sd;
342                         break;
343                 case SIBA_DEVID_80211:
344                         n_80211++;
345                         if (n_80211 > 1) {
346                                 device_printf(siba->siba_dev,
347                                     "warn: multiple 802.11 core\n");
348                                 continue;
349                         }
350                         break;
351                 case SIBA_DEVID_PCI:
352                 case SIBA_DEVID_PCIE:
353                         n_pci++;
354                         error = pci_find_extcap(siba->siba_dev, PCIY_EXPRESS,
355                             &base);
356                         is_pcie = (error == 0) ? 1 : 0;
357
358                         if (n_pci > 1) {
359                                 device_printf(siba->siba_dev,
360                                     "warn: multiple PCI(E) cores\n");
361                                 break;
362                         }
363                         if (sd->sd_id.sd_device == SIBA_DEVID_PCI &&
364                             is_pcie == 1)
365                                 continue;
366                         if (sd->sd_id.sd_device == SIBA_DEVID_PCIE &&
367                             is_pcie == 0)
368                                 continue;
369                         siba->siba_pci.spc_dev = sd;
370                         break;
371                 case SIBA_DEVID_MODEM:
372                 case SIBA_DEVID_PCMCIA:
373                         break;
374                 default:
375                         device_printf(siba->siba_dev,
376                             "unsupported coreid (%s)\n",
377                             siba_core_name(sd->sd_id.sd_device));
378                         break;
379                 }
380                 dev_i++;
381
382                 child = device_add_child(siba->siba_dev, NULL, -1);
383                 if (child == NULL) {
384                         device_printf(siba->siba_dev, "child attach failed\n");
385                         continue;
386                 }
387
388                 device_set_ivars(child, sd);
389         }
390         siba->siba_ndevs = dev_i;
391 }
392
393 static int
394 siba_switchcore(struct siba_softc *siba, uint8_t idx)
395 {
396
397         switch (siba->siba_type) {
398         case SIBA_TYPE_PCI:
399                 return (siba_pci_switchcore_sub(siba, idx));
400         default:
401                 KASSERT(0 == 1,
402                     ("%s: unsupported bustype %#x", __func__,
403                     siba->siba_type));
404         }
405         return (0);
406 }
407
408 static int
409 siba_pci_switchcore_sub(struct siba_softc *siba, uint8_t idx)
410 {
411 #define RETRY_MAX       50
412         int i;
413         uint32_t dir;
414
415         dir = SIBA_REGWIN(idx);
416
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)
420                         return (0);
421                 DELAY(10);
422         }
423         return (ENODEV);
424 #undef RETRY_MAX
425 }
426
427 static int
428 siba_pci_switchcore(struct siba_softc *siba, struct siba_dev_softc *sd)
429 {
430         int error;
431
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);
434
435         error = siba_pci_switchcore_sub(siba, sd->sd_coreidx);
436         if (error == 0)
437                 siba->siba_curdev = sd;
438
439         return (error);
440 }
441
442 static uint32_t
443 siba_scan_read_4(struct siba_softc *siba, uint8_t coreidx,
444     uint16_t offset)
445 {
446
447         (void)coreidx;
448         KASSERT(siba->siba_type == SIBA_TYPE_PCI,
449             ("unsupported BUS type (%#x)", siba->siba_type));
450
451         return (SIBA_READ_4(siba, offset));
452 }
453
454 static uint16_t
455 siba_dev2chipid(struct siba_softc *siba)
456 {
457         uint16_t chipid = 0;
458
459         switch (siba->siba_pci_did) {
460         case 0x4301:
461                 chipid = 0x4301;
462                 break;
463         case 0x4305:
464         case 0x4306:
465         case 0x4307:
466                 chipid = 0x4307;
467                 break;
468         case 0x4403:
469                 chipid = 0x4402;
470                 break;
471         case 0x4610:
472         case 0x4611:
473         case 0x4612:
474         case 0x4613:
475         case 0x4614:
476         case 0x4615:
477                 chipid = 0x4610;
478                 break;
479         case 0x4710:
480         case 0x4711:
481         case 0x4712:
482         case 0x4713:
483         case 0x4714:
484         case 0x4715:
485                 chipid = 0x4710;
486                 break;
487         case 0x4320:
488         case 0x4321:
489         case 0x4322:
490         case 0x4323:
491         case 0x4324:
492         case 0x4325:
493                 chipid = 0x4309;
494                 break;
495         case PCI_DEVICE_ID_BCM4401:
496         case PCI_DEVICE_ID_BCM4401B0:
497         case PCI_DEVICE_ID_BCM4401B1:
498                 chipid = 0x4401;
499                 break;
500         default:
501                 device_printf(siba->siba_dev, "unknown PCI did (%d)\n",
502                     siba->siba_pci_did);
503         }
504
505         return (chipid);
506 }
507
508 /*
509  * Earlier ChipCommon revisions have hardcoded number of cores
510  * present dependent on the ChipCommon ID.
511  */
512 uint8_t
513 siba_getncores(device_t dev, uint16_t chipid)
514 {
515         switch (chipid) {
516         case 0x4401:
517         case 0x4402:
518                 return (3);
519         case 0x4301:
520         case 0x4307:
521                 return (5);
522         case 0x4306:
523                 return (6);
524         case SIBA_CCID_SENTRY5:
525                 return (7);
526         case 0x4310:
527                 return (8);
528         case SIBA_CCID_BCM4710:
529         case 0x4610:
530         case SIBA_CCID_BCM4704:
531                 return (9);
532         default:
533                 device_printf(dev, "unknown the chipset ID %#x\n", chipid);
534         }
535
536         return (1);
537 }
538
539 static const char *
540 siba_core_name(uint16_t coreid)
541 {
542
543         switch (coreid) {
544         case SIBA_DEVID_CHIPCOMMON:
545                 return ("ChipCommon");
546         case SIBA_DEVID_ILINE20:
547                 return ("ILine 20");
548         case SIBA_DEVID_SDRAM:
549                 return ("SDRAM");
550         case SIBA_DEVID_PCI:
551                 return ("PCI");
552         case SIBA_DEVID_MIPS:
553                 return ("MIPS");
554         case SIBA_DEVID_ETHERNET:
555                 return ("Fast Ethernet");
556         case SIBA_DEVID_MODEM:
557                 return ("Modem");
558         case SIBA_DEVID_USB11_HOSTDEV:
559                 return ("USB 1.1 Hostdev");
560         case SIBA_DEVID_ADSL:
561                 return ("ADSL");
562         case SIBA_DEVID_ILINE100:
563                 return ("ILine 100");
564         case SIBA_DEVID_IPSEC:
565                 return ("IPSEC");
566         case SIBA_DEVID_PCMCIA:
567                 return ("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:
573                 return ("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:
591                 return ("PATA");
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:
599                 return ("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:
605                 return ("ARM 1176");
606         case SIBA_DEVID_ARM_7TDMI:
607                 return ("ARM 7TDMI");
608         }
609         return ("unknown");
610 }
611
612 static uint16_t
613 siba_pci_read_2(struct siba_dev_softc *sd, uint16_t offset)
614 {
615         struct siba_softc *siba = sd->sd_bus;
616
617         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
618                 return (0xffff);
619
620         return (SIBA_READ_2(siba, offset));
621 }
622
623 static uint32_t
624 siba_pci_read_4(struct siba_dev_softc *sd, uint16_t offset)
625 {
626         struct siba_softc *siba = sd->sd_bus;
627
628         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
629                 return (0xffff);
630
631         return (SIBA_READ_4(siba, offset));
632 }
633
634 static void
635 siba_pci_write_2(struct siba_dev_softc *sd, uint16_t offset, uint16_t value)
636 {
637         struct siba_softc *siba = sd->sd_bus;
638
639         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
640                 return;
641
642         SIBA_WRITE_2(siba, offset, value);
643 }
644
645 static void
646 siba_pci_write_4(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
647 {
648         struct siba_softc *siba = sd->sd_bus;
649
650         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
651                 return;
652
653         SIBA_WRITE_4(siba, offset, value);
654 }
655
656 static void
657 siba_pci_read_multi_1(struct siba_dev_softc *sd, void *buffer, size_t count,
658     uint16_t offset)
659 {
660         struct siba_softc *siba = sd->sd_bus;
661
662         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
663                 memset(buffer, 0xff, count);
664                 return;
665         }
666
667         SIBA_READ_MULTI_1(siba, offset, buffer, count);
668 }
669
670 static void
671 siba_pci_read_multi_2(struct siba_dev_softc *sd, void *buffer, size_t count,
672     uint16_t offset)
673 {
674         struct siba_softc *siba = sd->sd_bus;
675
676         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
677                 memset(buffer, 0xff, count);
678                 return;
679         }
680
681         KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
682         SIBA_READ_MULTI_2(siba, offset, buffer, count >> 1);
683 }
684
685 static void
686 siba_pci_read_multi_4(struct siba_dev_softc *sd, void *buffer, size_t count,
687     uint16_t offset)
688 {
689         struct siba_softc *siba = sd->sd_bus;
690
691         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0) {
692                 memset(buffer, 0xff, count);
693                 return;
694         }
695
696         KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
697         SIBA_READ_MULTI_4(siba, offset, buffer, count >> 2);
698 }
699
700 static void
701 siba_pci_write_multi_1(struct siba_dev_softc *sd, const void *buffer,
702     size_t count, uint16_t offset)
703 {
704         struct siba_softc *siba = sd->sd_bus;
705
706         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
707                 return;
708
709         SIBA_WRITE_MULTI_1(siba, offset, buffer, count);
710 }
711
712 static void
713 siba_pci_write_multi_2(struct siba_dev_softc *sd, const void *buffer,
714     size_t count, uint16_t offset)
715 {
716         struct siba_softc *siba = sd->sd_bus;
717
718         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
719                 return;
720
721         KASSERT(!(count & 1), ("%s:%d: fail", __func__, __LINE__));
722         SIBA_WRITE_MULTI_2(siba, offset, buffer, count >> 1);
723 }
724
725 static void
726 siba_pci_write_multi_4(struct siba_dev_softc *sd, const void *buffer,
727     size_t count, uint16_t offset)
728 {
729         struct siba_softc *siba = sd->sd_bus;
730
731         if (siba->siba_curdev != sd && siba_pci_switchcore(siba, sd) != 0)
732                 return;
733
734         KASSERT(!(count & 3), ("%s:%d: fail", __func__, __LINE__));
735         SIBA_WRITE_MULTI_4(siba, offset, buffer, count >> 2);
736 }
737
738 void
739 siba_powerup(device_t dev, int dynamic)
740 {
741         struct siba_dev_softc *sd = device_get_ivars(dev);
742         struct siba_softc *siba = sd->sd_bus;
743
744         siba_powerup_sub(siba, dynamic);
745 }
746
747 static void
748 siba_powerup_sub(struct siba_softc *siba, int dynamic)
749 {
750
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);
754 }
755
756 static void
757 siba_cc_clock(struct siba_cc *scc, enum siba_clock clock)
758 {
759         struct siba_dev_softc *sd = scc->scc_dev;
760         struct siba_softc *siba;
761         uint32_t tmp;
762
763         if (sd == NULL)
764                 return;
765         siba = sd->sd_bus;
766         /*
767          * chipcommon < r6 (no dynamic clock control)
768          * chipcommon >= r10 (unknown)
769          */
770         if (sd->sd_id.sd_rev < 6 || sd->sd_id.sd_rev >= 10 ||
771             (scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
772                 return;
773
774         switch (clock) {
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);
784                 break;
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);
789                 break;
790         case SIBA_CLOCK_FAST:
791                 /* crystal on */
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);
796                 break;
797         default:
798                 KASSERT(0 == 1,
799                     ("%s: unsupported clock %#x", __func__, clock));
800         }
801 }
802
803 uint16_t
804 siba_read_2(device_t dev, uint16_t offset)
805 {
806         struct siba_dev_softc *sd = device_get_ivars(dev);
807
808         return (sd->sd_ops->read_2(sd, offset));
809 }
810
811 uint32_t
812 siba_read_4(device_t dev, uint16_t offset)
813 {
814         struct siba_dev_softc *sd = device_get_ivars(dev);
815
816         return (siba_read_4_sub(sd, offset));
817 }
818
819 static uint32_t
820 siba_read_4_sub(struct siba_dev_softc *sd, uint16_t offset)
821 {
822
823         return (sd->sd_ops->read_4(sd, offset));
824 }
825
826 void
827 siba_write_2(device_t dev, uint16_t offset, uint16_t value)
828 {
829         struct siba_dev_softc *sd = device_get_ivars(dev);
830
831         sd->sd_ops->write_2(sd, offset, value);
832 }
833
834 void
835 siba_write_4(device_t dev, uint16_t offset, uint32_t value)
836 {
837         struct siba_dev_softc *sd = device_get_ivars(dev);
838
839         return (siba_write_4_sub(sd, offset, value));
840 }
841
842 static void
843 siba_write_4_sub(struct siba_dev_softc *sd, uint16_t offset, uint32_t value)
844 {
845
846         sd->sd_ops->write_4(sd, offset, value);
847 }
848
849 void
850 siba_read_multi_1(device_t dev, void *buffer, size_t count,
851     uint16_t offset)
852 {
853         struct siba_dev_softc *sd = device_get_ivars(dev);
854
855         sd->sd_ops->read_multi_1(sd, buffer, count, offset);
856 }
857
858 void
859 siba_read_multi_2(device_t dev, void *buffer, size_t count,
860     uint16_t offset)
861 {
862         struct siba_dev_softc *sd = device_get_ivars(dev);
863
864         sd->sd_ops->read_multi_2(sd, buffer, count, offset);
865 }
866
867 void
868 siba_read_multi_4(device_t dev, void *buffer, size_t count,
869     uint16_t offset)
870 {
871         struct siba_dev_softc *sd = device_get_ivars(dev);
872
873         sd->sd_ops->read_multi_4(sd, buffer, count, offset);
874 }
875
876 void
877 siba_write_multi_1(device_t dev, const void *buffer, size_t count,
878     uint16_t offset)
879 {
880         struct siba_dev_softc *sd = device_get_ivars(dev);
881
882         sd->sd_ops->write_multi_1(sd, buffer, count, offset);
883 }
884
885 void
886 siba_write_multi_2(device_t dev, const void *buffer, size_t count,
887     uint16_t offset)
888 {
889         struct siba_dev_softc *sd = device_get_ivars(dev);
890
891         sd->sd_ops->write_multi_2(sd, buffer, count, offset);
892 }
893
894 void
895 siba_write_multi_4(device_t dev, const void *buffer, size_t count,
896     uint16_t offset)
897 {
898         struct siba_dev_softc *sd = device_get_ivars(dev);
899
900         sd->sd_ops->write_multi_4(sd, buffer, count, offset);
901 }
902
903 static void
904 siba_cc_pmu_init(struct siba_cc *scc)
905 {
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;
912
913         if ((scc->scc_caps & SIBA_CC_CAPS_PMU) == 0)
914                 return;
915
916         pmucap = SIBA_CC_READ32(scc, SIBA_CC_PMUCAPS);
917         scc->scc_pmu.rev = (pmucap & SIBA_CC_PMUCAPS_REV);
918
919         DPRINTF(siba, SIBA_DEBUG_PMU, "PMU(r%u) found (caps %#x)\n",
920             scc->scc_pmu.rev, pmucap);
921
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);
926                 else
927                         SIBA_CC_SET32(scc, SIBA_CC_PMUCTL,
928                             SIBA_CC_PMUCTL_NOILP);
929         }
930
931         /* initialize PLL & PMU resources */
932         switch (siba->siba_chipid) {
933         case 0x4312:
934                 siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
935                 /* use the default: min = 0xcbb max = 0x7ffff */
936                 break;
937         case 0x4325:
938                 siba_cc_pmu1_pll0_init(scc, 0 /* use default */);
939
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);
944
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);
950                 max = 0xfffff;
951                 break;
952         case 0x4328:
953                 siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
954
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);
959
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);
963
964                 max = 0xfffff;
965                 break;
966         case 0x5354:
967                 siba_cc_pmu0_pll0_init(scc, 0 /* use default */);
968
969                 max = 0xfffff;
970                 break;
971         default:
972                 device_printf(siba->siba_dev,
973                     "unknown chipid %#x for PLL & PMU init\n",
974                     siba->siba_chipid);
975         }
976
977         if (updown) {
978                 for (i = 0; i < updown_size; i++) {
979                         SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
980                             updown[i].res);
981                         SIBA_CC_WRITE32(scc, SIBA_CC_PMU_UPDNTM,
982                             updown[i].updown);
983                 }
984         }
985         if (depend) {
986                 for (i = 0; i < depend_size; i++) {
987                         SIBA_CC_WRITE32(scc, SIBA_CC_PMU_TABSEL,
988                             depend[i].res);
989                         switch (depend[i].task) {
990                         case SIBA_CC_PMU_DEP_SET:
991                                 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_DEPMSK,
992                                     depend[i].depend);
993                                 break;
994                         case SIBA_CC_PMU_DEP_ADD:
995                                 SIBA_CC_SET32(scc, SIBA_CC_PMU_DEPMSK,
996                                     depend[i].depend);
997                                 break;
998                         case SIBA_CC_PMU_DEP_REMOVE:
999                                 SIBA_CC_MASK32(scc, SIBA_CC_PMU_DEPMSK,
1000                                     ~(depend[i].depend));
1001                                 break;
1002                         default:
1003                                 KASSERT(0 == 1,
1004                                     ("%s:%d: assertion failed",
1005                                         __func__, __LINE__));
1006                         }
1007                 }
1008         }
1009
1010         if (min)
1011                 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MINRES, min);
1012         if (max)
1013                 SIBA_CC_WRITE32(scc, SIBA_CC_PMU_MAXRES, max);
1014 }
1015
1016 static void
1017 siba_cc_power_init(struct siba_cc *scc)
1018 {
1019         struct siba_softc *siba = scc->scc_dev->sd_bus;
1020         int maxfreq;
1021
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);
1027         }
1028
1029         if ((scc->scc_caps & SIBA_CC_CAPS_PWCTL) == 0)
1030                 return;
1031
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) &
1035                     0xffff) | 0x40000);
1036         else {
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);
1042         }
1043 }
1044
1045 static void
1046 siba_cc_powerup_delay(struct siba_cc *scc)
1047 {
1048         struct siba_softc *siba = scc->scc_dev->sd_bus;
1049         int min;
1050
1051         if (siba->siba_type != SIBA_TYPE_PCI ||
1052             !(scc->scc_caps & SIBA_CC_CAPS_PWCTL))
1053                 return;
1054
1055         min = siba_cc_clockfreq(scc, 0);
1056         scc->scc_powerup_delay =
1057             (((SIBA_CC_READ32(scc, SIBA_CC_PLLONDELAY) + 2) * 1000000) +
1058             (min - 1)) / min;
1059 }
1060
1061 static int
1062 siba_cc_clockfreq(struct siba_cc *scc, int max)
1063 {
1064         enum siba_clksrc src;
1065         int div = 1, limit = 0;
1066
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;
1071                 KASSERT(div != 1,
1072                     ("%s: unknown clock %d", __func__, src));
1073         } else if (scc->scc_dev->sd_id.sd_rev < 10) {
1074                 switch (src) {
1075                 case SIBA_CC_CLKSRC_CRYSTAL:
1076                 case SIBA_CC_CLKSRC_PCI:
1077                         div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) >> 16) +
1078                             1) * 4;
1079                         break;
1080                 case SIBA_CC_CLKSRC_LOWPW:
1081                         break;
1082                 }
1083         } else
1084                 div = ((SIBA_CC_READ32(scc, SIBA_CC_CLKSYSCTL) >> 16) + 1) * 4;
1085
1086         switch (src) {
1087         case SIBA_CC_CLKSRC_CRYSTAL:
1088                 limit = (max) ? 20200000 : 19800000;
1089                 break;
1090         case SIBA_CC_CLKSRC_LOWPW:
1091                 limit = (max) ? 43000 : 25000;
1092                 break;
1093         case SIBA_CC_CLKSRC_PCI:
1094                 limit = (max) ? 34000000 : 25000000;
1095                 break;
1096         }
1097
1098         return (limit / div);
1099 }
1100
1101 static void
1102 siba_cc_pmu1_pll0_init(struct siba_cc *scc, uint32_t freq)
1103 {
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;
1108         unsigned int i;
1109
1110         KASSERT(freq == 0, ("%s:%d: assertion vail", __func__, __LINE__));
1111         if (siba->siba_chipid == 0x4312) {
1112                 scc->scc_pmu.freq = 20000;
1113                 return;
1114         }
1115
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;
1119
1120         pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1121         if (SIBA_CC_PMUCTL_XF_VAL(pmu) == e->xf)
1122                 return;
1123
1124         DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1125             (e->freq / 1000), (e->freq % 1000));
1126
1127         /* turn PLL off */
1128         switch (siba->siba_chipid) {
1129         case 0x4325:
1130                 bufsth = 0x222222;
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)));
1137                 break;
1138         default:
1139                 KASSERT(0 == 1,
1140                     ("%s:%d: assertion failed", __func__, __LINE__));
1141         }
1142         for (i = 0; i < 1500; i++) {
1143                 if (!(SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS) &
1144                       SIBA_CC_CLKCTLSTATUS_HT))
1145                         break;
1146                 DELAY(10);
1147         }
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");
1150
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);
1156
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);
1162
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);
1167
1168         if (bufsth) {
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);
1173         }
1174
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) &
1178             SIBA_CC_PMUCTL_ILP;
1179         pmu |= ((uint32_t)e->xf << 2) & SIBA_CC_PMUCTL_XF;
1180         SIBA_CC_WRITE32(scc, SIBA_CC_PMUCTL, pmu);
1181 }
1182
1183 static void
1184 siba_cc_pmu0_pll0_init(struct siba_cc *scc, uint32_t xtalfreq)
1185 {
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;
1190         unsigned int i;
1191
1192         if ((siba->siba_chipid == 0x5354) && !xtalfreq)
1193                 xtalfreq = 25000;
1194         if (xtalfreq)
1195                 e = siba_cc_pmu0_plltab_findentry(xtalfreq);
1196         if (e == NULL)
1197                 e = siba_cc_pmu0_plltab_findentry(
1198                     SIBA_CC_PMU0_DEFAULT_XTALFREQ);
1199         KASSERT(e != NULL, ("%s:%d: fail", __func__, __LINE__));
1200         xtalfreq = e->freq;
1201         scc->scc_pmu.freq = e->freq;
1202
1203         pmu = SIBA_CC_READ32(scc, SIBA_CC_PMUCTL);
1204         if (((pmu & SIBA_CC_PMUCTL_XF) >> 2) == e->xf)
1205                 return;
1206
1207         DPRINTF(siba, SIBA_DEBUG_PLL, "change PLL value to %u.%03u MHz\n",
1208             (xtalfreq / 1000), (xtalfreq % 1000));
1209
1210         KASSERT(siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354,
1211             ("%s:%d: fail", __func__, __LINE__));
1212
1213         switch (siba->siba_chipid) {
1214         case 0x4328:
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));
1219                 break;
1220         case 0x5354:
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));
1225                 break;
1226         }
1227         for (i = 1500; i; i--) {
1228                 tmp = SIBA_CC_READ32(scc, SIBA_CC_CLKCTLSTATUS);
1229                 if (!(tmp & SIBA_CC_CLKCTLSTATUS_HT))
1230                         break;
1231                 DELAY(10);
1232         }
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");
1236
1237         /* set PDIV */
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;
1241         else
1242                 pll &= ~SIBA_CC_PMU0_PLL0_PDIV_MSK;
1243         siba_cc_pll_write(scc, SIBA_CC_PMU0_PLL0, pll);
1244
1245         /* set WILD */
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);
1254
1255         /* set WILD */
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);
1260
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);
1268 }
1269
1270 static enum siba_clksrc
1271 siba_cc_clksrc(struct siba_cc *scc)
1272 {
1273         struct siba_dev_softc *sd = scc->scc_dev;
1274         struct siba_softc *siba = sd->sd_bus;
1275
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) &
1279                             0x10)
1280                                 return (SIBA_CC_CLKSRC_PCI);
1281                         return (SIBA_CC_CLKSRC_CRYSTAL);
1282                 }
1283                 if (siba->siba_type == SIBA_TYPE_SSB ||
1284                     siba->siba_type == SIBA_TYPE_PCMCIA)
1285                         return (SIBA_CC_CLKSRC_CRYSTAL);
1286         }
1287         if (sd->sd_id.sd_rev < 10) {
1288                 switch (SIBA_CC_READ32(scc, SIBA_CC_CLKSLOW) & 0x7) {
1289                 case 0:
1290                         return (SIBA_CC_CLKSRC_LOWPW);
1291                 case 1:
1292                         return (SIBA_CC_CLKSRC_CRYSTAL);
1293                 case 2:
1294                         return (SIBA_CC_CLKSRC_PCI);
1295                 default:
1296                         break;
1297                 }
1298         }
1299
1300         return (SIBA_CC_CLKSRC_CRYSTAL);
1301 }
1302
1303 static const struct siba_cc_pmu1_plltab *
1304 siba_cc_pmu1_plltab_find(uint32_t crystalfreq)
1305 {
1306         const struct siba_cc_pmu1_plltab *e;
1307         unsigned int i;
1308
1309         for (i = 0; i < N(siba_cc_pmu1_plltab); i++) {
1310                 e = &siba_cc_pmu1_plltab[i];
1311                 if (crystalfreq == e->freq)
1312                         return (e);
1313         }
1314
1315         return (NULL);
1316 }
1317
1318 static uint32_t
1319 siba_cc_pll_read(struct siba_cc *scc, uint32_t offset)
1320 {
1321
1322         SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1323         return (SIBA_CC_READ32(scc, SIBA_CC_PLLCTL_DATA));
1324 }
1325
1326 static void
1327 siba_cc_pll_write(struct siba_cc *scc, uint32_t offset, uint32_t value)
1328 {
1329
1330         SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_ADDR, offset);
1331         SIBA_CC_WRITE32(scc, SIBA_CC_PLLCTL_DATA, value);
1332 }
1333
1334 static const struct siba_cc_pmu0_plltab *
1335 siba_cc_pmu0_plltab_findentry(uint32_t crystalfreq)
1336 {
1337         const struct siba_cc_pmu0_plltab *e;
1338         unsigned int i;
1339
1340         for (i = 0; i < N(siba_cc_pmu0_plltab); i++) {
1341                 e = &siba_cc_pmu0_plltab[i];
1342                 if (e->freq == crystalfreq)
1343                         return (e);
1344         }
1345
1346         return (NULL);
1347 }
1348
1349 static int
1350 siba_pci_sprom(struct siba_softc *siba, struct siba_sprom *sprom)
1351 {
1352         int error = ENOMEM;
1353         uint16_t *buf;
1354
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);
1359         if (error) {
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);
1365                 if (error)
1366                         device_printf(siba->siba_dev, "warn: bad SPROM CRC\n");
1367         }
1368
1369         bzero(sprom, sizeof(*sprom));
1370
1371         sprom->rev = buf[siba->siba_spromsize - 1] & 0x00FF;
1372         DPRINTF(siba, SIBA_DEBUG_SPROM, "SPROM rev %d\n",
1373             sprom->rev);
1374         memset(sprom->mac_eth, 0xff, 6);
1375         memset(sprom->mac_80211a, 0xff, 6);
1376         if ((siba->siba_chipid & 0xff00) == 0x4400) {
1377                 sprom->rev = 1;
1378                 siba_sprom_r123(sprom, buf);
1379         } else if (siba->siba_chipid == 0x4321) {
1380                 sprom->rev = 4;
1381                 siba_sprom_r45(sprom, buf);
1382         } else {
1383                 switch (sprom->rev) {
1384                 case 1:
1385                 case 2:
1386                 case 3:
1387                         siba_sprom_r123(sprom, buf);
1388                         break;
1389                 case 4:
1390                 case 5:
1391                         siba_sprom_r45(sprom, buf);
1392                         break;
1393                 case 8:
1394                         siba_sprom_r8(sprom, buf);
1395                         break;
1396                 default:
1397                         device_printf(siba->siba_dev,
1398                             "unknown SPROM revision %d.\n", sprom->rev);
1399                         siba_sprom_r123(sprom, buf);
1400                 }
1401         }
1402
1403         if (sprom->bf_lo == 0xffff)
1404                 sprom->bf_lo = 0;
1405         if (sprom->bf_hi == 0xffff)
1406                 sprom->bf_hi = 0;
1407
1408         kfree(buf, M_DEVBUF);
1409         return (error);
1410 }
1411
1412 static int
1413 siba_sprom_read(struct siba_softc *siba, uint16_t *sprom, uint16_t len)
1414 {
1415         int i;
1416
1417         for (i = 0; i < len; i++)
1418                 sprom[i] = SIBA_READ_2(siba, SIBA_SPROM_BASE + (i * 2));
1419
1420         siba->siba_spromsize = len;
1421         return (0);
1422 }
1423
1424 static int
1425 sprom_check_crc(const uint16_t *sprom, size_t size)
1426 {
1427         int word;
1428         uint8_t crc0, crc1 = 0xff;
1429
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);
1434         }
1435         crc1 = siba_crc8(crc1, sprom[size - 1] & 0x00ff);
1436         crc1 ^= 0xff;
1437
1438         return ((crc0 != crc1) ? EPROTO : 0);
1439 }
1440
1441 static uint8_t
1442 siba_crc8(uint8_t crc, uint8_t data)
1443 {
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,
1477         };
1478         return (ct[crc ^ data]);
1479 }
1480
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))
1491
1492 static void
1493 siba_sprom_r123(struct siba_sprom *out, const uint16_t *in)
1494 {
1495         int i;
1496         uint16_t v;
1497         int8_t gain;
1498         uint16_t loc[3];
1499
1500         if (out->rev == 3)
1501                 loc[0] = SIBA_SPROM3_MAC_80211BG;
1502         else {
1503                 loc[0] = SIBA_SPROM1_MAC_80211BG;
1504                 loc[1] = SIBA_SPROM1_MAC_ETH;
1505                 loc[2] = SIBA_SPROM1_MAC_80211A;
1506         }
1507         for (i = 0; i < 3; i++) {
1508                 v = in[SIBA_OFFSET(loc[0]) + i];
1509                 *(((uint16_t *)out->mac_80211bg) + i) = htobe16(v);
1510         }
1511         if (out->rev < 3) {
1512                 for (i = 0; i < 3; i++) {
1513                         v = in[SIBA_OFFSET(loc[1]) + i];
1514                         *(((uint16_t *)out->mac_eth) + i) = htobe16(v);
1515                 }
1516                 for (i = 0; i < 3; i++) {
1517                         v = in[SIBA_OFFSET(loc[2]) + i];
1518                         *(((uint16_t *)out->mac_80211a) + i) = htobe16(v);
1519                 }
1520         }
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);
1545
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);
1551         if (out->rev >= 2)
1552                 SIBA_SHIFTOUT(bf_hi, SIBA_SPROM2_BFHIGH, 0xffff);
1553
1554         /* antenna gain */
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;
1561 }
1562
1563 static void
1564 siba_sprom_r45(struct siba_sprom *out, const uint16_t *in)
1565 {
1566         int i;
1567         uint16_t v;
1568         uint16_t mac_80211bg_offset;
1569
1570         if (out->rev == 4)
1571                 mac_80211bg_offset = SIBA_SPROM4_MAC_80211BG;
1572         else
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);
1577         }
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);
1584         } else {
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);
1588         }
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);
1600         } else {
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);
1605         }
1606
1607         /* antenna gain */
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));
1613 }
1614
1615 static void
1616 siba_sprom_r8(struct siba_sprom *out, const uint16_t *in)
1617 {
1618         int i;
1619         uint16_t v;
1620
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);
1624         }
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);
1658
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);
1672
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);
1677
1678         /* antenna gain */
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));
1684 }
1685
1686 static int8_t
1687 siba_sprom_r123_antgain(uint8_t sprom_revision, const uint16_t *in,
1688     uint16_t mask, uint16_t shift)
1689 {
1690         uint16_t v;
1691         uint8_t gain;
1692
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);
1697
1698         return ((int8_t)gain);
1699 }
1700
1701 #undef SIBA_LOWEST_SET_BIT
1702 #undef SIBA_OFFSET
1703 #undef SIBA_SHIFTOUT_SUB
1704 #undef SIBA_SHIFTOUT
1705
1706 int
1707 siba_powerdown(device_t dev)
1708 {
1709         struct siba_dev_softc *sd = device_get_ivars(dev);
1710         struct siba_softc *siba = sd->sd_bus;
1711
1712         return (siba_powerdown_sub(siba));
1713 }
1714
1715 static int
1716 siba_powerdown_sub(struct siba_softc *siba)
1717 {
1718         struct siba_cc *scc;
1719
1720         if (siba->siba_type == SIBA_TYPE_SSB)
1721                 return (0);
1722
1723         scc = &siba->siba_cc;
1724         if (scc->scc_dev == NULL || scc->scc_dev->sd_id.sd_rev < 5)
1725                 return (0);
1726         siba_cc_clock(scc, SIBA_CLOCK_SLOW);
1727         siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
1728         return (0);
1729 }
1730
1731 static void
1732 siba_pcicore_init(struct siba_pci *spc)
1733 {
1734         struct siba_dev_softc *sd = spc->spc_dev;
1735         struct siba_softc *siba;
1736
1737         if (sd == NULL)
1738                 return;
1739
1740         siba = sd->sd_bus;
1741         if (!siba_dev_isup_sub(sd))
1742                 siba_dev_up_sub(sd, 0);
1743
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);
1748 }
1749
1750 int
1751 siba_dev_isup(device_t dev)
1752 {
1753         struct siba_dev_softc *sd = device_get_ivars(dev);
1754
1755         return (siba_dev_isup_sub(sd));
1756 }
1757
1758 static int
1759 siba_dev_isup_sub(struct siba_dev_softc *sd)
1760 {
1761         uint32_t reject, val;
1762
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;
1766
1767         return (val == SIBA_TGSLOW_CLOCK);
1768 }
1769
1770 void
1771 siba_dev_up(device_t dev, uint32_t flags)
1772 {
1773         struct siba_dev_softc *sd = device_get_ivars(dev);
1774
1775         siba_dev_up_sub(sd, flags);
1776 }
1777
1778 static void
1779 siba_dev_up_sub(struct siba_dev_softc *sd, uint32_t flags)
1780 {
1781         uint32_t val;
1782
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);
1787         DELAY(1);
1788
1789         if (siba_read_4_sub(sd, SIBA_TGSHIGH) & SIBA_TGSHIGH_SERR)
1790                 siba_write_4_sub(sd, SIBA_TGSHIGH, 0);
1791
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);
1796         }
1797
1798         siba_write_4_sub(sd, SIBA_TGSLOW,
1799             SIBA_TGSLOW_CLOCK | SIBA_TGSLOW_FGC | flags);
1800         siba_read_4_sub(sd, SIBA_TGSLOW);
1801         DELAY(1);
1802
1803         siba_write_4_sub(sd, SIBA_TGSLOW, SIBA_TGSLOW_CLOCK | flags);
1804         siba_read_4_sub(sd, SIBA_TGSLOW);
1805         DELAY(1);
1806 }
1807
1808 static uint32_t
1809 siba_tmslow_reject_bitmask(struct siba_dev_softc *sd)
1810 {
1811         uint32_t rev = siba_read_4_sub(sd, SIBA_IDLOW) & SIBA_IDLOW_SSBREV;
1812
1813         switch (rev) {
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);
1823         default:
1824                 KASSERT(0 == 1,
1825                     ("%s:%d: unknown backplane rev %#x\n",
1826                         __func__, __LINE__, rev));
1827         }
1828         return (SIBA_TGSLOW_REJECT_22 | SIBA_TGSLOW_REJECT_23);
1829 }
1830
1831 void
1832 siba_dev_down(device_t dev, uint32_t flags)
1833 {
1834         struct siba_dev_softc *sd = device_get_ivars(dev);
1835
1836         siba_dev_down_sub(sd, flags);
1837 }
1838
1839 static void
1840 siba_dev_down_sub(struct siba_dev_softc *sd, uint32_t flags)
1841 {
1842         struct siba_softc *siba = sd->sd_bus;
1843         uint32_t reject, val;
1844         int i;
1845
1846         if (siba_read_4_sub(sd, SIBA_TGSLOW) & SIBA_TGSLOW_RESET)
1847                 return;
1848
1849         reject = siba_tmslow_reject_bitmask(sd);
1850         siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_CLOCK);
1851
1852         for (i = 0; i < 1000; i++) {
1853                 val = siba_read_4_sub(sd, SIBA_TGSLOW);
1854                 if (val & reject)
1855                         break;
1856                 DELAY(10);
1857         }
1858         if ((val & reject) == 0) {
1859                 device_printf(siba->siba_dev, "timeout (bit %#x reg %#x)\n",
1860                     reject, SIBA_TGSLOW);
1861         }
1862         for (i = 0; i < 1000; i++) {
1863                 val = siba_read_4_sub(sd, SIBA_TGSHIGH);
1864                 if (!(val & SIBA_TGSHIGH_BUSY))
1865                         break;
1866                 DELAY(10);
1867         }
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);
1871         }
1872
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);
1876         DELAY(1);
1877         siba_write_4_sub(sd, SIBA_TGSLOW, reject | SIBA_TGSLOW_RESET | flags);
1878         siba_read_4_sub(sd, SIBA_TGSLOW);
1879         DELAY(1);
1880 }
1881
1882 static void
1883 siba_pcicore_setup(struct siba_pci *spc, struct siba_dev_softc *sd)
1884 {
1885         struct siba_dev_softc *psd = spc->spc_dev;
1886         struct siba_softc *siba = psd->sd_bus;
1887         uint32_t tmp;
1888
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);
1893
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);
1900
1901                         /* broadcast value */
1902                         sd = (siba->siba_cc.scc_dev != NULL) ?
1903                             siba->siba_cc.scc_dev : siba->siba_pci.spc_dev;
1904                         if (sd != NULL) {
1905                                 siba_write_4_sub(sd, SIBA_PCICORE_BCAST_ADDR,
1906                                     0xfd8);
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);
1911                         }
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);
1916                 }
1917         } else {
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);
1929         }
1930         spc->spc_inited = 1;
1931 }
1932
1933 void
1934 siba_pcicore_intr(device_t dev)
1935 {
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;
1940         uint32_t tmp;
1941
1942         if (siba->siba_type != SIBA_TYPE_PCI || !psd)
1943                 return;
1944
1945         KASSERT(siba == psd->sd_bus, ("different pointers"));
1946
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);
1954         } else {
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));
1959         }
1960
1961         /* setup PCIcore */
1962         if (spc->spc_inited == 0)
1963                 siba_pcicore_setup(spc, sd);
1964 }
1965
1966 static uint32_t
1967 siba_pcicore_read_4(struct siba_pci *spc, uint16_t offset)
1968 {
1969
1970         return (siba_read_4_sub(spc->spc_dev, offset));
1971 }
1972
1973 static void
1974 siba_pcicore_write_4(struct siba_pci *spc, uint16_t offset, uint32_t value)
1975 {
1976
1977         siba_write_4_sub(spc->spc_dev, offset, value);
1978 }
1979
1980 static uint32_t
1981 siba_pcie_read(struct siba_pci *spc, uint32_t address)
1982 {
1983
1984         siba_pcicore_write_4(spc, 0x130, address);
1985         return (siba_pcicore_read_4(spc, 0x134));
1986 }
1987
1988 static void
1989 siba_pcie_write(struct siba_pci *spc, uint32_t address, uint32_t data)
1990 {
1991
1992         siba_pcicore_write_4(spc, 0x130, address);
1993         siba_pcicore_write_4(spc, 0x134, data);
1994 }
1995
1996 static void
1997 siba_pcie_mdio_write(struct siba_pci *spc, uint8_t device, uint8_t address,
1998     uint16_t data)
1999 {
2000         int i;
2001
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) |
2006             (1 << 17) | data);
2007         DELAY(10);
2008         for (i = 0; i < 10; i++) {
2009                 if (siba_pcicore_read_4(spc, SIBA_PCICORE_MDIO_CTL) & 0x100)
2010                         break;
2011                 DELAY(1000);
2012         }
2013         siba_pcicore_write_4(spc, SIBA_PCICORE_MDIO_CTL, 0);
2014 }
2015
2016 uint32_t
2017 siba_dma_translation(device_t dev)
2018 {
2019 #ifdef INVARIANTS
2020         struct siba_dev_softc *sd = device_get_ivars(dev);
2021         struct siba_softc *siba = sd->sd_bus;
2022
2023         KASSERT(siba->siba_type == SIBA_TYPE_PCI,
2024             ("unsupported bustype %d\n", siba->siba_type));
2025 #endif
2026         return (SIBA_PCI_DMA);
2027 }
2028
2029 void
2030 siba_barrier(device_t dev, int flags)
2031 {
2032         struct siba_dev_softc *sd = device_get_ivars(dev);
2033         struct siba_softc *siba = sd->sd_bus;
2034
2035         SIBA_BARRIER(siba, flags);
2036 }
2037
2038 static void
2039 siba_cc_suspend(struct siba_cc *scc)
2040 {
2041
2042         siba_cc_clock(scc, SIBA_CLOCK_SLOW);
2043 }
2044
2045 static void
2046 siba_cc_resume(struct siba_cc *scc)
2047 {
2048
2049         siba_cc_power_init(scc);
2050         siba_cc_clock(scc, SIBA_CLOCK_FAST);
2051 }
2052
2053 int
2054 siba_core_suspend(struct siba_softc *siba)
2055 {
2056
2057         siba_cc_suspend(&siba->siba_cc);
2058         siba_pci_gpio(siba, SIBA_GPIO_CRYSTAL | SIBA_GPIO_PLL, 0);
2059         return (0);
2060 }
2061
2062 int
2063 siba_core_resume(struct siba_softc *siba)
2064 {
2065
2066         siba->siba_pci.spc_inited = 0;
2067         siba->siba_curdev = NULL;
2068
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);
2073
2074         return (0);
2075 }
2076
2077 static void
2078 siba_cc_regctl_setmask(struct siba_cc *cc, uint32_t offset, uint32_t mask,
2079     uint32_t set)
2080 {
2081
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);
2088 }
2089
2090 void
2091 siba_cc_pmu_set_ldovolt(device_t dev, int id, uint32_t volt)
2092 {
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] = {
2097                 { 2, 25,  0xf },
2098                 { 3,  1,  0xf },
2099                 { 3,  9,  0xf },
2100                 { 3, 17, 0x3f },
2101                 { 0, 21, 0x3f }
2102         };
2103
2104         if (siba->siba_chipid == 0x4312) {
2105                 if (id != SIBA_LDO_PAREF)
2106                         return;
2107                 p = info[4];
2108                 siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2109                     (volt & p[2]) << p[1]);
2110                 return;
2111         }
2112         if (siba->siba_chipid == 0x4328 || siba->siba_chipid == 0x5354) {
2113                 switch (id) {
2114                 case SIBA_LDO_PAREF:
2115                         p = info[3];
2116                         break;
2117                 case SIBA_LDO_VOLT1:
2118                         p = info[0];
2119                         break;
2120                 case SIBA_LDO_VOLT2:
2121                         p = info[1];
2122                         break;
2123                 case SIBA_LDO_VOLT3:
2124                         p = info[2];
2125                         break;
2126                 default:
2127                         KASSERT(0 == 1,
2128                             ("%s: unsupported voltage ID %#x", __func__, id));
2129                         return;
2130                 }
2131                 siba_cc_regctl_setmask(scc, p[0], ~(p[2] << p[1]),
2132                     (volt & p[2]) << p[1]);
2133         }
2134 }
2135
2136 void
2137 siba_cc_pmu_set_ldoparef(device_t dev, uint8_t on)
2138 {
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;
2142         int ldo;
2143
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)));
2147         if (ldo == -1)
2148                 return;
2149
2150         if (on)
2151                 SIBA_CC_SET32(scc, SIBA_CC_PMU_MINRES, 1 << ldo);
2152         else
2153                 SIBA_CC_MASK32(scc, SIBA_CC_PMU_MINRES, ~(1 << ldo));
2154         SIBA_CC_READ32(scc, SIBA_CC_PMU_MINRES);
2155 }
2156
2157 int
2158 siba_read_sprom(device_t dev, device_t child, int which, uintptr_t *result)
2159 {
2160         struct siba_dev_softc *sd = device_get_ivars(child);
2161         struct siba_softc *siba = sd->sd_bus;
2162
2163         switch (which) {
2164         case SIBA_SPROMVAR_REV:
2165                 *result = siba->siba_sprom.rev;
2166                 break;
2167         case SIBA_SPROMVAR_MAC_80211BG:
2168                 *((uint8_t **) result) = siba->siba_sprom.mac_80211bg;
2169                 break;
2170         case SIBA_SPROMVAR_MAC_ETH:
2171                 *((uint8_t **) result) = siba->siba_sprom.mac_eth;
2172                 break;
2173         case SIBA_SPROMVAR_MAC_80211A:
2174                 *((uint8_t **) result) = siba->siba_sprom.mac_80211a;
2175                 break;
2176         case SIBA_SPROMVAR_MII_ETH0:
2177                 *result = siba->siba_sprom.mii_eth0;
2178                 break;
2179         case SIBA_SPROMVAR_MII_ETH1:
2180                 *result = siba->siba_sprom.mii_eth1;
2181                 break;
2182         case SIBA_SPROMVAR_MDIO_ETH0:
2183                 *result = siba->siba_sprom.mdio_eth0;
2184                 break;
2185         case SIBA_SPROMVAR_MDIO_ETH1:
2186                 *result = siba->siba_sprom.mdio_eth1;
2187                 break;
2188         case SIBA_SPROMVAR_BREV:
2189                 *result = siba->siba_sprom.brev;
2190                 break;
2191         case SIBA_SPROMVAR_CCODE:
2192                 *result = siba->siba_sprom.ccode;
2193                 break;
2194         case SIBA_SPROMVAR_ANT_A:
2195                 *result = siba->siba_sprom.ant_a;
2196                 break;
2197         case SIBA_SPROMVAR_ANT_BG:
2198                 *result = siba->siba_sprom.ant_bg;
2199                 break;
2200         case SIBA_SPROMVAR_PA0B0:
2201                 *result = siba->siba_sprom.pa0b0;
2202                 break;
2203         case SIBA_SPROMVAR_PA0B1:
2204                 *result = siba->siba_sprom.pa0b1;
2205                 break;
2206         case SIBA_SPROMVAR_PA0B2:
2207                 *result = siba->siba_sprom.pa0b2;
2208                 break;
2209         case SIBA_SPROMVAR_PA1B0:
2210                 *result = siba->siba_sprom.pa1b0;
2211                 break;
2212         case SIBA_SPROMVAR_PA1B1:
2213                 *result = siba->siba_sprom.pa1b1;
2214                 break;
2215         case SIBA_SPROMVAR_PA1B2:
2216                 *result = siba->siba_sprom.pa1b2;
2217                 break;
2218         case SIBA_SPROMVAR_PA1LOB0:
2219                 *result = siba->siba_sprom.pa1lob0;
2220                 break;
2221         case SIBA_SPROMVAR_PA1LOB1:
2222                 *result = siba->siba_sprom.pa1lob1;
2223                 break;
2224         case SIBA_SPROMVAR_PA1LOB2:
2225                 *result = siba->siba_sprom.pa1lob2;
2226                 break;
2227         case SIBA_SPROMVAR_PA1HIB0:
2228                 *result = siba->siba_sprom.pa1hib0;
2229                 break;
2230         case SIBA_SPROMVAR_PA1HIB1:
2231                 *result = siba->siba_sprom.pa1hib1;
2232                 break;
2233         case SIBA_SPROMVAR_PA1HIB2:
2234                 *result = siba->siba_sprom.pa1hib2;
2235                 break;
2236         case SIBA_SPROMVAR_GPIO0:
2237                 *result = siba->siba_sprom.gpio0;
2238                 break;
2239         case SIBA_SPROMVAR_GPIO1:
2240                 *result = siba->siba_sprom.gpio1;
2241                 break;
2242         case SIBA_SPROMVAR_GPIO2:
2243                 *result = siba->siba_sprom.gpio2;
2244                 break;
2245         case SIBA_SPROMVAR_GPIO3:
2246                 *result = siba->siba_sprom.gpio3;
2247                 break;
2248         case SIBA_SPROMVAR_MAXPWR_AL:
2249                 *result = siba->siba_sprom.maxpwr_al;
2250                 break;
2251         case SIBA_SPROMVAR_MAXPWR_A:
2252                 *result = siba->siba_sprom.maxpwr_a;
2253                 break;
2254         case SIBA_SPROMVAR_MAXPWR_AH:
2255                 *result = siba->siba_sprom.maxpwr_ah;
2256                 break;
2257         case SIBA_SPROMVAR_MAXPWR_BG:
2258                 *result = siba->siba_sprom.maxpwr_bg;
2259                 break;
2260         case SIBA_SPROMVAR_RXPO2G:
2261                 *result = siba->siba_sprom.rxpo2g;
2262                 break;
2263         case SIBA_SPROMVAR_RXPO5G:
2264                 *result = siba->siba_sprom.rxpo5g;
2265                 break;
2266         case SIBA_SPROMVAR_TSSI_A:
2267                 *result = siba->siba_sprom.tssi_a;
2268                 break;
2269         case SIBA_SPROMVAR_TSSI_BG:
2270                 *result = siba->siba_sprom.tssi_bg;
2271                 break;
2272         case SIBA_SPROMVAR_TRI2G:
2273                 *result = siba->siba_sprom.tri2g;
2274                 break;
2275         case SIBA_SPROMVAR_TRI5GL:
2276                 *result = siba->siba_sprom.tri5gl;
2277                 break;
2278         case SIBA_SPROMVAR_TRI5G:
2279                 *result = siba->siba_sprom.tri5g;
2280                 break;
2281         case SIBA_SPROMVAR_TRI5GH:
2282                 *result = siba->siba_sprom.tri5gh;
2283                 break;
2284         case SIBA_SPROMVAR_RSSISAV2G:
2285                 *result = siba->siba_sprom.rssisav2g;
2286                 break;
2287         case SIBA_SPROMVAR_RSSISMC2G:
2288                 *result = siba->siba_sprom.rssismc2g;
2289                 break;
2290         case SIBA_SPROMVAR_RSSISMF2G:
2291                 *result = siba->siba_sprom.rssismf2g;
2292                 break;
2293         case SIBA_SPROMVAR_BXA2G:
2294                 *result = siba->siba_sprom.bxa2g;
2295                 break;
2296         case SIBA_SPROMVAR_RSSISAV5G:
2297                 *result = siba->siba_sprom.rssisav5g;
2298                 break;
2299         case SIBA_SPROMVAR_RSSISMC5G:
2300                 *result = siba->siba_sprom.rssismc5g;
2301                 break;
2302         case SIBA_SPROMVAR_RSSISMF5G:
2303                 *result = siba->siba_sprom.rssismf5g;
2304                 break;
2305         case SIBA_SPROMVAR_BXA5G:
2306                 *result = siba->siba_sprom.bxa5g;
2307                 break;
2308         case SIBA_SPROMVAR_CCK2GPO:
2309                 *result = siba->siba_sprom.cck2gpo;
2310                 break;
2311         case SIBA_SPROMVAR_OFDM2GPO:
2312                 *result = siba->siba_sprom.ofdm2gpo;
2313                 break;
2314         case SIBA_SPROMVAR_OFDM5GLPO:
2315                 *result = siba->siba_sprom.ofdm5glpo;
2316                 break;
2317         case SIBA_SPROMVAR_OFDM5GPO:
2318                 *result = siba->siba_sprom.ofdm5gpo;
2319                 break;
2320         case SIBA_SPROMVAR_OFDM5GHPO:
2321                 *result = siba->siba_sprom.ofdm5ghpo;
2322                 break;
2323         case SIBA_SPROMVAR_BF_LO:
2324                 *result = siba->siba_sprom.bf_lo;
2325                 break;
2326         case SIBA_SPROMVAR_BF_HI:
2327                 *result = siba->siba_sprom.bf_hi;
2328                 break;
2329         case SIBA_SPROMVAR_BF2_LO:
2330                 *result = siba->siba_sprom.bf2_lo;
2331                 break;
2332         case SIBA_SPROMVAR_BF2_HI:
2333                 *result = siba->siba_sprom.bf2_hi;
2334                 break;
2335         default:
2336                 return (ENOENT);
2337         }
2338         return (0);
2339 }
2340
2341 int
2342 siba_write_sprom(device_t dev, device_t child, int which, uintptr_t value)
2343 {
2344         struct siba_dev_softc *sd = device_get_ivars(child);
2345         struct siba_softc *siba = sd->sd_bus;
2346
2347         switch (which) {
2348         case SIBA_SPROMVAR_REV:
2349                 siba->siba_sprom.rev = value;
2350                 break;
2351         case SIBA_SPROMVAR_MII_ETH0:
2352                 siba->siba_sprom.mii_eth0 = value;
2353                 break;
2354         case SIBA_SPROMVAR_MII_ETH1:
2355                 siba->siba_sprom.mii_eth1 = value;
2356                 break;
2357         case SIBA_SPROMVAR_MDIO_ETH0:
2358                 siba->siba_sprom.mdio_eth0 = value;
2359                 break;
2360         case SIBA_SPROMVAR_MDIO_ETH1:
2361                 siba->siba_sprom.mdio_eth1 = value;
2362                 break;
2363         case SIBA_SPROMVAR_BREV:
2364                 siba->siba_sprom.brev = value;
2365                 break;
2366         case SIBA_SPROMVAR_CCODE:
2367                 siba->siba_sprom.ccode = value;
2368                 break;
2369         case SIBA_SPROMVAR_ANT_A:
2370                 siba->siba_sprom.ant_a = value;
2371                 break;
2372         case SIBA_SPROMVAR_ANT_BG:
2373                 siba->siba_sprom.ant_bg = value;
2374                 break;
2375         case SIBA_SPROMVAR_PA0B0:
2376                 siba->siba_sprom.pa0b0 = value;
2377                 break;
2378         case SIBA_SPROMVAR_PA0B1:
2379                 siba->siba_sprom.pa0b1 = value;
2380                 break;
2381         case SIBA_SPROMVAR_PA0B2:
2382                 siba->siba_sprom.pa0b2 = value;
2383                 break;
2384         case SIBA_SPROMVAR_PA1B0:
2385                 siba->siba_sprom.pa1b0 = value;
2386                 break;
2387         case SIBA_SPROMVAR_PA1B1:
2388                 siba->siba_sprom.pa1b1 = value;
2389                 break;
2390         case SIBA_SPROMVAR_PA1B2:
2391                 siba->siba_sprom.pa1b2 = value;
2392                 break;
2393         case SIBA_SPROMVAR_PA1LOB0:
2394                 siba->siba_sprom.pa1lob0 = value;
2395                 break;
2396         case SIBA_SPROMVAR_PA1LOB1:
2397                 siba->siba_sprom.pa1lob1 = value;
2398                 break;
2399         case SIBA_SPROMVAR_PA1LOB2:
2400                 siba->siba_sprom.pa1lob2 = value;
2401                 break;
2402         case SIBA_SPROMVAR_PA1HIB0:
2403                 siba->siba_sprom.pa1hib0 = value;
2404                 break;
2405         case SIBA_SPROMVAR_PA1HIB1:
2406                 siba->siba_sprom.pa1hib1 = value;
2407                 break;
2408         case SIBA_SPROMVAR_PA1HIB2:
2409                 siba->siba_sprom.pa1hib2 = value;
2410                 break;
2411         case SIBA_SPROMVAR_GPIO0:
2412                 siba->siba_sprom.gpio0 = value;
2413                 break;
2414         case SIBA_SPROMVAR_GPIO1:
2415                 siba->siba_sprom.gpio1 = value;
2416                 break;
2417         case SIBA_SPROMVAR_GPIO2:
2418                 siba->siba_sprom.gpio2 = value;
2419                 break;
2420         case SIBA_SPROMVAR_GPIO3:
2421                 siba->siba_sprom.gpio3 = value;
2422                 break;
2423         case SIBA_SPROMVAR_MAXPWR_AL:
2424                 siba->siba_sprom.maxpwr_al = value;
2425                 break;
2426         case SIBA_SPROMVAR_MAXPWR_A:
2427                 siba->siba_sprom.maxpwr_a = value;
2428                 break;
2429         case SIBA_SPROMVAR_MAXPWR_AH:
2430                 siba->siba_sprom.maxpwr_ah = value;
2431                 break;
2432         case SIBA_SPROMVAR_MAXPWR_BG:
2433                 siba->siba_sprom.maxpwr_bg = value;
2434                 break;
2435         case SIBA_SPROMVAR_RXPO2G:
2436                 siba->siba_sprom.rxpo2g = value;
2437                 break;
2438         case SIBA_SPROMVAR_RXPO5G:
2439                 siba->siba_sprom.rxpo5g = value;
2440                 break;
2441         case SIBA_SPROMVAR_TSSI_A:
2442                 siba->siba_sprom.tssi_a = value;
2443                 break;
2444         case SIBA_SPROMVAR_TSSI_BG:
2445                 siba->siba_sprom.tssi_bg = value;
2446                 break;
2447         case SIBA_SPROMVAR_TRI2G:
2448                 siba->siba_sprom.tri2g = value;
2449                 break;
2450         case SIBA_SPROMVAR_TRI5GL:
2451                 siba->siba_sprom.tri5gl = value;
2452                 break;
2453         case SIBA_SPROMVAR_TRI5G:
2454                 siba->siba_sprom.tri5g = value;
2455                 break;
2456         case SIBA_SPROMVAR_TRI5GH:
2457                 siba->siba_sprom.tri5gh = value;
2458                 break;
2459         case SIBA_SPROMVAR_RSSISAV2G:
2460                 siba->siba_sprom.rssisav2g = value;
2461                 break;
2462         case SIBA_SPROMVAR_RSSISMC2G:
2463                 siba->siba_sprom.rssismc2g = value;
2464                 break;
2465         case SIBA_SPROMVAR_RSSISMF2G:
2466                 siba->siba_sprom.rssismf2g = value;
2467                 break;
2468         case SIBA_SPROMVAR_BXA2G:
2469                 siba->siba_sprom.bxa2g = value;
2470                 break;
2471         case SIBA_SPROMVAR_RSSISAV5G:
2472                 siba->siba_sprom.rssisav5g = value;
2473                 break;
2474         case SIBA_SPROMVAR_RSSISMC5G:
2475                 siba->siba_sprom.rssismc5g = value;
2476                 break;
2477         case SIBA_SPROMVAR_RSSISMF5G:
2478                 siba->siba_sprom.rssismf5g = value;
2479                 break;
2480         case SIBA_SPROMVAR_BXA5G:
2481                 siba->siba_sprom.bxa5g = value;
2482                 break;
2483         case SIBA_SPROMVAR_CCK2GPO:
2484                 siba->siba_sprom.cck2gpo = value;
2485                 break;
2486         case SIBA_SPROMVAR_OFDM2GPO:
2487                 siba->siba_sprom.ofdm2gpo = value;
2488                 break;
2489         case SIBA_SPROMVAR_OFDM5GLPO:
2490                 siba->siba_sprom.ofdm5glpo = value;
2491                 break;
2492         case SIBA_SPROMVAR_OFDM5GPO:
2493                 siba->siba_sprom.ofdm5gpo = value;
2494                 break;
2495         case SIBA_SPROMVAR_OFDM5GHPO:
2496                 siba->siba_sprom.ofdm5ghpo = value;
2497                 break;
2498         case SIBA_SPROMVAR_BF_LO:
2499                 siba->siba_sprom.bf_lo = value;
2500                 break;
2501         case SIBA_SPROMVAR_BF_HI:
2502                 siba->siba_sprom.bf_hi = value;
2503                 break;
2504         case SIBA_SPROMVAR_BF2_LO:
2505                 siba->siba_sprom.bf2_lo = value;
2506                 break;
2507         case SIBA_SPROMVAR_BF2_HI:
2508                 siba->siba_sprom.bf2_hi = value;
2509                 break;
2510         default:
2511                 return (ENOENT);
2512         }
2513         return (0);
2514 }
2515
2516 #define SIBA_GPIOCTL                    0x06c
2517
2518 uint32_t
2519 siba_gpio_get(device_t dev)
2520 {
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;
2524
2525         pcidev = siba->siba_pci.spc_dev;
2526         gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
2527         if (gpiodev == NULL)
2528                 return (-1);
2529         return (siba_read_4_sub(gpiodev, SIBA_GPIOCTL));
2530 }
2531
2532 void
2533 siba_gpio_set(device_t dev, uint32_t value)
2534 {
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;
2538
2539         pcidev = siba->siba_pci.spc_dev;
2540         gpiodev = siba->siba_cc.scc_dev ? siba->siba_cc.scc_dev : pcidev;
2541         if (gpiodev == NULL)
2542                 return;
2543         siba_write_4_sub(gpiodev, SIBA_GPIOCTL, value);
2544 }
2545
2546 void
2547 siba_fix_imcfglobug(device_t dev)
2548 {
2549         struct siba_dev_softc *sd = device_get_ivars(dev);
2550         struct siba_softc *siba = sd->sd_bus;
2551         uint32_t tmp;
2552
2553         if (siba->siba_pci.spc_dev == NULL)
2554                 return;
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)
2557                 return;
2558
2559         tmp = siba_read_4_sub(sd, SIBA_IMCFGLO) &
2560             ~(SIBA_IMCFGLO_REQTO | SIBA_IMCFGLO_SERTO);
2561         switch (siba->siba_type) {
2562         case SIBA_TYPE_PCI:
2563         case SIBA_TYPE_PCMCIA:
2564                 tmp |= 0x32;
2565                 break;
2566         case SIBA_TYPE_SSB:
2567                 tmp |= 0x53;
2568                 break;
2569         }
2570         siba_write_4_sub(sd, SIBA_IMCFGLO, tmp);
2571 }