aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2003-10-06 07:17:20 +0000
committerWarner Losh <imp@FreeBSD.org>2003-10-06 07:17:20 +0000
commitd266c2db1c923c73bd401f1e02592e541de9bf4a (patch)
treefe9be305acf746a40ea45621b4cf7713d53ae7f6 /sys/dev
parent6ea91a6bcba0381db9705b2bd3d9239157dec7c1 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pccard/pccard_cis_quirks.c108
-rw-r--r--sys/dev/pccard/pccardvar.h6
2 files changed, 58 insertions, 56 deletions
diff --git a/sys/dev/pccard/pccard_cis_quirks.c b/sys/dev/pccard/pccard_cis_quirks.c
index 98cf67ef85d31..87928b506f3fc 100644
--- a/sys/dev/pccard/pccard_cis_quirks.c
+++ b/sys/dev/pccard/pccard_cis_quirks.c
@@ -208,6 +208,23 @@ static struct pccard_cis_quirk pccard_cis_quirks[] = {
static int n_pccard_cis_quirks =
sizeof(pccard_cis_quirks)/sizeof(pccard_cis_quirks[0]);
+static int
+pccard_cis_quirk_match(struct pccard_softc *sc, struct pccard_cis_quirk *q)
+{
+ if ((sc->card.manufacturer == q->manufacturer) &&
+ (sc->card.product == q->product) &&
+ (((sc->card.manufacturer != PCMCIA_VENDOR_INVALID) &&
+ (sc->card.product != PCMCIA_PRODUCT_INVALID)) ||
+ ((sc->card.manufacturer == PCMCIA_VENDOR_INVALID) &&
+ (sc->card.product == PCMCIA_PRODUCT_INVALID) &&
+ sc->card.cis1_info[0] &&
+ (strcmp(sc->card.cis1_info[0], q->cis1_info[0]) == 0) &&
+ sc->card.cis1_info[1] &&
+ (strcmp(sc->card.cis1_info[1], q->cis1_info[1]) == 0))))
+ return (1);
+ return (0);
+}
+
void pccard_check_cis_quirks(device_t dev)
{
struct pccard_softc *sc = PCCARD_SOFTC(dev);
@@ -215,69 +232,56 @@ void pccard_check_cis_quirks(device_t dev)
int i, j;
struct pccard_function *pf, *pf_next, *pf_last;
struct pccard_config_entry *cfe, *cfe_next;
+ struct pccard_cis_quirk *q;
pf = NULL;
pf_last = NULL;
for (i=0; i<n_pccard_cis_quirks; i++) {
- if ((sc->card.manufacturer == pccard_cis_quirks[i].manufacturer) &&
- (sc->card.product == pccard_cis_quirks[i].product) &&
- (((sc->card.manufacturer != PCMCIA_VENDOR_INVALID) &&
- (sc->card.product != PCMCIA_PRODUCT_INVALID)) ||
- ((sc->card.manufacturer == PCMCIA_VENDOR_INVALID) &&
- (sc->card.product == PCMCIA_PRODUCT_INVALID) &&
- sc->card.cis1_info[0] &&
- (strcmp(sc->card.cis1_info[0],
- pccard_cis_quirks[i].cis1_info[0]) == 0) &&
- sc->card.cis1_info[1] &&
- (strcmp(sc->card.cis1_info[1],
- pccard_cis_quirks[i].cis1_info[1]) == 0)))) {
- if (!wiped) {
- if (bootverbose) {
- device_printf(dev, "using CIS quirks for ");
- for (j = 0; j < 4; j++) {
- if (sc->card.cis1_info[j] == NULL)
- break;
- if (j)
- printf(", ");
- printf("%s", sc->card.cis1_info[j]);
- }
- printf("\n");
+ q = &pccard_cis_quirks[i];
+ if (!pccard_cis_quirk_match(sc, q))
+ continue;
+ if (!wiped) {
+ if (bootverbose) {
+ device_printf(dev, "using CIS quirks for ");
+ for (j = 0; j < 4; j++) {
+ if (sc->card.cis1_info[j] == NULL)
+ break;
+ if (j)
+ printf(", ");
+ printf("%s", sc->card.cis1_info[j]);
}
+ printf("\n");
+ }
- for (pf = STAILQ_FIRST(&sc->card.pf_head); pf != NULL;
- pf = pf_next) {
- for (cfe = STAILQ_FIRST(&pf->cfe_head); cfe != NULL;
- cfe = cfe_next) {
- cfe_next = STAILQ_NEXT(cfe, cfe_list);
- free(cfe, M_DEVBUF);
- }
- pf_next = STAILQ_NEXT(pf, pf_list);
- free(pf, M_DEVBUF);
+ for (pf = STAILQ_FIRST(&sc->card.pf_head); pf != NULL;
+ pf = pf_next) {
+ for (cfe = STAILQ_FIRST(&pf->cfe_head); cfe != NULL;
+ cfe = cfe_next) {
+ cfe_next = STAILQ_NEXT(cfe, cfe_list);
+ free(cfe, M_DEVBUF);
}
-
- STAILQ_INIT(&sc->card.pf_head);
- wiped = 1;
+ pf_next = STAILQ_NEXT(pf, pf_list);
+ free(pf, M_DEVBUF);
}
- if (pf_last == pccard_cis_quirks[i].pf) {
- cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
- *cfe = *pccard_cis_quirks[i].cfe;
-
- STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
- } else {
- pf = malloc(sizeof(*pf), M_DEVBUF, M_NOWAIT);
- *pf = *pccard_cis_quirks[i].pf;
- STAILQ_INIT(&pf->cfe_head);
-
- cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
- *cfe = *pccard_cis_quirks[i].cfe;
-
- STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
- STAILQ_INSERT_TAIL(&sc->card.pf_head, pf, pf_list);
+ STAILQ_INIT(&sc->card.pf_head);
+ wiped = 1;
+ }
- pf_last = pccard_cis_quirks[i].pf;
- }
+ if (pf_last == q->pf) {
+ cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
+ *cfe = *q->cfe;
+ STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
+ } else {
+ pf = malloc(sizeof(*pf), M_DEVBUF, M_NOWAIT);
+ *pf = *q->pf;
+ STAILQ_INIT(&pf->cfe_head);
+ cfe = malloc(sizeof(*cfe), M_DEVBUF, M_NOWAIT);
+ *cfe = *q->cfe;
+ STAILQ_INSERT_TAIL(&pf->cfe_head, cfe, cfe_list);
+ STAILQ_INSERT_TAIL(&sc->card.pf_head, pf, pf_list);
+ pf_last = q->pf;
}
}
}
diff --git a/sys/dev/pccard/pccardvar.h b/sys/dev/pccard/pccardvar.h
index 43266f0d63871..0289a3fb04bc2 100644
--- a/sys/dev/pccard/pccardvar.h
+++ b/sys/dev/pccard/pccardvar.h
@@ -203,9 +203,6 @@ struct pccard_softc {
int sc_enabled_count; /* num functions enabled */
};
-void
-pccardbus_if_setup(struct pccard_softc*);
-
struct pccard_cis_quirk {
int32_t manufacturer;
int32_t product;
@@ -286,7 +283,8 @@ int pccard_scan_cis(device_t,
#define PCCARD_SPACE_MEMORY 1
#define PCCARD_SPACE_IO 2
-#define pccard_mfc(sc) (STAILQ_FIRST(&(sc)->card.pf_head) && \
+#define pccard_mfc(sc) \
+ (STAILQ_FIRST(&(sc)->card.pf_head) && \
STAILQ_NEXT(STAILQ_FIRST(&(sc)->card.pf_head),pf_list))
#define pccard_io_alloc(pf, start, size, align, pciop) \