Deleted Added
full compact
pccard.c (58581) pccard.c (59193)
1/* $NetBSD: pcmcia.c,v 1.13 1998/12/24 04:51:59 marc Exp $ */
1/* $NetBSD: pcmcia.c,v 1.13 1998/12/24 04:51:59 marc Exp $ */
2/* $FreeBSD: head/sys/dev/pccard/pccard.c 58581 2000-03-26 07:01:52Z imp $ */
2/* $FreeBSD: head/sys/dev/pccard/pccard.c 59193 2000-04-13 06:42:58Z imp $ */
3
4/*
5 * Copyright (c) 1997 Marc Horowitz. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright

--- 32 unchanged lines hidden (view full) ---

43#include <sys/rman.h>
44#include <machine/resource.h>
45
46#include <dev/pccard/pccardreg.h>
47#include <dev/pccard/pccardchip.h>
48#include <dev/pccard/pccardvar.h>
49
50#include "power_if.h"
3
4/*
5 * Copyright (c) 1997 Marc Horowitz. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright

--- 32 unchanged lines hidden (view full) ---

43#include <sys/rman.h>
44#include <machine/resource.h>
45
46#include <dev/pccard/pccardreg.h>
47#include <dev/pccard/pccardchip.h>
48#include <dev/pccard/pccardvar.h>
49
50#include "power_if.h"
51#include "card_if.h"
51
52#define PCCARDDEBUG
53
54#ifdef PCCARDDEBUG
55int pccard_debug = 1;
56#define DPRINTF(arg) if (pccard_debug) printf arg
57#define DEVPRINTF(arg) if (pccard_debug) device_printf arg
52
53#define PCCARDDEBUG
54
55#ifdef PCCARDDEBUG
56int pccard_debug = 1;
57#define DPRINTF(arg) if (pccard_debug) printf arg
58#define DEVPRINTF(arg) if (pccard_debug) device_printf arg
58int pccardintr_debug = 0;
59/* this is done this way to avoid doing lots of conditionals
60 at interrupt level. */
61#define PCCARD_CARD_INTR (pccardintr_debug?pccard_card_intrdebug:pccard_card_intr)
62#else
63#define DPRINTF(arg)
64#define DEVPRINTF(arg)
59#else
60#define DPRINTF(arg)
61#define DEVPRINTF(arg)
65#define PCCARD_CARD_INTR (pccard_card_intr)
66#endif
67
68#ifdef PCCARDVERBOSE
69int pccard_verbose = 1;
70#else
71int pccard_verbose = 0;
72#endif
73
74int pccard_print(void *, const char *);
75
62#endif
63
64#ifdef PCCARDVERBOSE
65int pccard_verbose = 1;
66#else
67int pccard_verbose = 0;
68#endif
69
70int pccard_print(void *, const char *);
71
76int pccard_card_intr(void *);
77#ifdef PCCARDDEBUG
78int pccard_card_intrdebug(void *);
79#endif
80
81int
82pccard_ccr_read(pf, ccr)
83 struct pccard_function *pf;
84 int ccr;
85{
86 return (bus_space_read_1(pf->pf_ccrt, pf->pf_ccrh,
87 pf->pf_ccr_offset + ccr));
88}

--- 6 unchanged lines hidden (view full) ---

95{
96
97 if ((pf->ccr_mask) & (1 << (ccr / 2))) {
98 bus_space_write_1(pf->pf_ccrt, pf->pf_ccrh,
99 pf->pf_ccr_offset + ccr, val);
100 }
101}
102
72int
73pccard_ccr_read(pf, ccr)
74 struct pccard_function *pf;
75 int ccr;
76{
77 return (bus_space_read_1(pf->pf_ccrt, pf->pf_ccrh,
78 pf->pf_ccr_offset + ccr));
79}

--- 6 unchanged lines hidden (view full) ---

86{
87
88 if ((pf->ccr_mask) & (1 << (ccr / 2))) {
89 bus_space_write_1(pf->pf_ccrt, pf->pf_ccrh,
90 pf->pf_ccr_offset + ccr, val);
91 }
92}
93
103int
104pccard_card_attach(device_t dev)
94static int
95pccard_attach_card(device_t dev)
105{
106 struct pccard_softc *sc = (struct pccard_softc *)
107 device_get_softc(dev);
108 struct pccard_function *pf;
109 int attached;
110
111 DEVPRINTF((dev, "pccard_card_attach\n"));
112 /*

--- 28 unchanged lines hidden (view full) ---

141
142 attached = 0;
143
144 DEVPRINTF((dev, "functions scanning\n"));
145 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
146 if (STAILQ_EMPTY(&pf->cfe_head))
147 continue;
148
96{
97 struct pccard_softc *sc = (struct pccard_softc *)
98 device_get_softc(dev);
99 struct pccard_function *pf;
100 int attached;
101
102 DEVPRINTF((dev, "pccard_card_attach\n"));
103 /*

--- 28 unchanged lines hidden (view full) ---

132
133 attached = 0;
134
135 DEVPRINTF((dev, "functions scanning\n"));
136 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
137 if (STAILQ_EMPTY(&pf->cfe_head))
138 continue;
139
149#ifdef DIAGNOSTIC
150 if (pf->child != NULL) {
151 device_printf(sc->dev,
152 "%s still attached to function %d!\n",
153 device_get_name(pf->child), pf->number);
154 panic("pccard_card_attach");
155 }
156#endif
157 pf->sc = sc;
140 pf->sc = sc;
158 pf->child = NULL;
159 pf->cfe = NULL;
160 pf->ih_fct = NULL;
161 pf->ih_arg = NULL;
162 }
163
164 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
165 if (STAILQ_EMPTY(&pf->cfe_head))
166 continue;

--- 12 unchanged lines hidden (view full) ---

179 pccard_ccr_read(pf, 0x10), pccard_ccr_read(pf, 0x12)));
180 }
181#endif
182 }
183
184 return (attached ? 0 : 1);
185}
186
141 pf->cfe = NULL;
142 pf->ih_fct = NULL;
143 pf->ih_arg = NULL;
144 }
145
146 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
147 if (STAILQ_EMPTY(&pf->cfe_head))
148 continue;

--- 12 unchanged lines hidden (view full) ---

161 pccard_ccr_read(pf, 0x10), pccard_ccr_read(pf, 0x12)));
162 }
163#endif
164 }
165
166 return (attached ? 0 : 1);
167}
168
187void
188pccard_card_detach(device_t dev, int flags)
169static int
170pccard_detach_card(device_t dev, int flags)
189{
190 struct pccard_softc *sc = (struct pccard_softc *)
191 device_get_softc(dev);
192 struct pccard_function *pf;
193#if XXX
194 int error;
195#endif
196
197 /*
198 * We are running on either the PCCARD socket's event thread
199 * or in user context detaching a device by user request.
200 */
201 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
202 if (STAILQ_FIRST(&pf->cfe_head) == NULL)
203 continue;
171{
172 struct pccard_softc *sc = (struct pccard_softc *)
173 device_get_softc(dev);
174 struct pccard_function *pf;
175#if XXX
176 int error;
177#endif
178
179 /*
180 * We are running on either the PCCARD socket's event thread
181 * or in user context detaching a device by user request.
182 */
183 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
184 if (STAILQ_FIRST(&pf->cfe_head) == NULL)
185 continue;
204 if (pf->child == NULL)
205 continue;
186#if XXX
206 DEVPRINTF((sc->dev, "detaching %s (function %d)\n",
207 device_get_name(pf->child), pf->number));
187 DEVPRINTF((sc->dev, "detaching %s (function %d)\n",
188 device_get_name(pf->child), pf->number));
208#if XXX
209 if ((error = config_detach(pf->child, flags)) != 0) {
210 device_printf(sc->dev,
211 "error %d detaching %s (function %d)\n",
212 error, device_get_name(pf->child), pf->number);
213 } else
214 pf->child = NULL;
215#endif
216 }
189 if ((error = config_detach(pf->child, flags)) != 0) {
190 device_printf(sc->dev,
191 "error %d detaching %s (function %d)\n",
192 error, device_get_name(pf->child), pf->number);
193 } else
194 pf->child = NULL;
195#endif
196 }
197 return 0;
217}
218
198}
199
219void
220pccard_card_deactivate(device_t dev)
200static int
201pccard_card_gettype(device_t dev, int *type)
221{
202{
222 struct pccard_softc *sc = (struct pccard_softc *)
223 device_get_softc(dev);
224 struct pccard_function *pf;
225
226 /*
227 * We're in the chip's card removal interrupt handler.
228 * Deactivate the child driver. The PCCARD socket's
229 * event thread will run later to finish the detach.
230 */
231 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
232 if (STAILQ_FIRST(&pf->cfe_head) == NULL)
233 continue;
234 if (pf->child == NULL)
235 continue;
236 DEVPRINTF((sc->dev, "deactivating %s (function %d)\n",
237 device_get_name(pf->child), pf->number));
238#if XXX
239 config_deactivate(pf->child);
240#endif
241 }
242}
243
244int
245pccard_card_gettype(device_t dev)
246{
247 struct pccard_softc *sc = (struct pccard_softc *)
248 device_get_softc(dev);
249 struct pccard_function *pf;
250
251 /*
252 * set the iftype to memory if this card has no functions (not yet
253 * probed), or only one function, and that is not initialized yet or
254 * that is memory.
255 */
256 pf = STAILQ_FIRST(&sc->card.pf_head);
257 if (pf == NULL ||
258 (STAILQ_NEXT(pf, pf_list) == NULL &&
259 (pf->cfe == NULL || pf->cfe->iftype == PCCARD_IFTYPE_MEMORY)))
203 struct pccard_softc *sc = (struct pccard_softc *)
204 device_get_softc(dev);
205 struct pccard_function *pf;
206
207 /*
208 * set the iftype to memory if this card has no functions (not yet
209 * probed), or only one function, and that is not initialized yet or
210 * that is memory.
211 */
212 pf = STAILQ_FIRST(&sc->card.pf_head);
213 if (pf == NULL ||
214 (STAILQ_NEXT(pf, pf_list) == NULL &&
215 (pf->cfe == NULL || pf->cfe->iftype == PCCARD_IFTYPE_MEMORY)))
260 return (PCCARD_IFTYPE_MEMORY);
216 *type = PCCARD_IFTYPE_MEMORY;
261 else
217 else
262 return (PCCARD_IFTYPE_IO);
218 *type = PCCARD_IFTYPE_IO;
219 return 0;
263}
264
265/*
266 * Initialize a PCCARD function. May be called as long as the function is
267 * disabled.
268 */
269void
270pccard_function_init(struct pccard_function *pf,

--- 255 unchanged lines hidden (view full) ---

526{
527
528 pccard_chip_io_unmap(pf->sc->pct, pf->sc->pch, window);
529
530 /* XXX Anything for multi-function cards? */
531}
532#endif
533
220}
221
222/*
223 * Initialize a PCCARD function. May be called as long as the function is
224 * disabled.
225 */
226void
227pccard_function_init(struct pccard_function *pf,

--- 255 unchanged lines hidden (view full) ---

483{
484
485 pccard_chip_io_unmap(pf->sc->pct, pf->sc->pch, window);
486
487 /* XXX Anything for multi-function cards? */
488}
489#endif
490
534/* I don't think FreeBSD needs the next two functions at all */
535/* XXX */
536int
537pccard_card_intr(void *arg)
538{
539 struct pccard_softc *sc = arg;
540 struct pccard_function *pf;
541 int reg, ret, ret2;
542
543 ret = 0;
544
545 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
546 if (pf->ih_fct != NULL &&
547 (pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) {
548 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
549 if (reg & PCCARD_CCR_STATUS_INTR) {
550 ret2 = (*pf->ih_fct)(pf->ih_arg);
551 if (ret2 != 0 && ret == 0)
552 ret = ret2;
553 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
554 pccard_ccr_write(pf, PCCARD_CCR_STATUS,
555 reg & ~PCCARD_CCR_STATUS_INTR);
556 }
557 }
558 }
559
560 return (ret);
561}
562
563#ifdef PCCARDDEBUG
564int
565pccard_card_intrdebug(arg)
566 void *arg;
567{
568 struct pccard_softc *sc = arg;
569 struct pccard_function *pf;
570 int reg, ret, ret2;
571
572 ret = 0;
573
574 STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
575 device_printf(sc->dev,
576 "intr flags=%x fct=%d cor=%02x csr=%02x pin=%02x",
577 pf->pf_flags, pf->number,
578 pccard_ccr_read(pf, PCCARD_CCR_OPTION),
579 pccard_ccr_read(pf, PCCARD_CCR_STATUS),
580 pccard_ccr_read(pf, PCCARD_CCR_PIN));
581 if (pf->ih_fct != NULL &&
582 (pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) {
583 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
584 if (reg & PCCARD_CCR_STATUS_INTR) {
585 ret2 = (*pf->ih_fct)(pf->ih_arg);
586 if (ret2 != 0 && ret == 0)
587 ret = ret2;
588 reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
589 printf("; csr %02x->%02x",
590 reg, reg & ~PCCARD_CCR_STATUS_INTR);
591 pccard_ccr_write(pf, PCCARD_CCR_STATUS,
592 reg & ~PCCARD_CCR_STATUS_INTR);
593 }
594 }
595 printf("\n");
596 }
597
598 return (ret);
599}
600#endif
601
602#define PCCARD_NPORT 2
603#define PCCARD_NMEM 5
604#define PCCARD_NIRQ 1
605#define PCCARD_NDRQ 0
606
607static int
608pccard_add_children(device_t dev, int busno)
609{
491#define PCCARD_NPORT 2
492#define PCCARD_NMEM 5
493#define PCCARD_NIRQ 1
494#define PCCARD_NDRQ 0
495
496static int
497pccard_add_children(device_t dev, int busno)
498{
499 /* Call parent to scan for any current children */
610 return 0;
611}
612
613static int
614pccard_probe(device_t dev)
615{
616 device_set_desc(dev, "PC Card bus -- newconfig version");
617 return pccard_add_children(dev, device_get_unit(dev));
618}
619
500 return 0;
501}
502
503static int
504pccard_probe(device_t dev)
505{
506 device_set_desc(dev, "PC Card bus -- newconfig version");
507 return pccard_add_children(dev, device_get_unit(dev));
508}
509
510static int
511pccard_attach(device_t dev)
512{
513 struct pccard_softc *sc;
514
515 sc = (struct pccard_softc *) device_get_softc(dev);
516 sc->dev = dev;
517
518 return bus_generic_attach(dev);
519}
520
620static void
621pccard_print_resources(struct resource_list *rl, const char *name, int type,
622 int count, const char *format)
623{
624 struct resource_list_entry *rle;
625 int printed;
626 int i;
627

--- 94 unchanged lines hidden (view full) ---

722static void
723pccard_delete_resource(device_t dev, device_t child, int type, int rid)
724{
725 struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child);
726 struct resource_list *rl = &devi->resources;
727 resource_list_delete(rl, type, rid);
728}
729
521static void
522pccard_print_resources(struct resource_list *rl, const char *name, int type,
523 int count, const char *format)
524{
525 struct resource_list_entry *rle;
526 int printed;
527 int i;
528

--- 94 unchanged lines hidden (view full) ---

623static void
624pccard_delete_resource(device_t dev, device_t child, int type, int rid)
625{
626 struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child);
627 struct resource_list *rl = &devi->resources;
628 resource_list_delete(rl, type, rid);
629}
630
631static int
632pccard_set_res_flags(device_t dev, device_t child, int type, int rid,
633 u_int32_t flags)
634{
635 return CARD_SET_RES_FLAGS(device_get_parent(dev), child, type,
636 rid, flags);
637}
638
639static int
640pccard_set_memory_offset(device_t dev, device_t child, int rid,
641 u_int32_t offset)
642{
643 return CARD_SET_MEMORY_OFFSET(device_get_parent(dev), child, rid,
644 offset);
645}
646
730static device_method_t pccard_methods[] = {
731 /* Device interface */
732 DEVMETHOD(device_probe, pccard_probe),
647static device_method_t pccard_methods[] = {
648 /* Device interface */
649 DEVMETHOD(device_probe, pccard_probe),
733 DEVMETHOD(device_attach, bus_generic_attach),
650 DEVMETHOD(device_attach, pccard_attach),
734 DEVMETHOD(device_shutdown, bus_generic_shutdown),
735 DEVMETHOD(device_suspend, bus_generic_suspend),
736 DEVMETHOD(device_resume, bus_generic_resume),
737
738 /* Bus interface */
739 DEVMETHOD(bus_print_child, pccard_print_child),
740 DEVMETHOD(bus_driver_added, bus_generic_driver_added),
741 DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource),
742 DEVMETHOD(bus_release_resource, bus_generic_release_resource),
743 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
744 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
745 DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
746 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
747 DEVMETHOD(bus_set_resource, pccard_set_resource),
748 DEVMETHOD(bus_get_resource, pccard_get_resource),
749 DEVMETHOD(bus_delete_resource, pccard_delete_resource),
750
651 DEVMETHOD(device_shutdown, bus_generic_shutdown),
652 DEVMETHOD(device_suspend, bus_generic_suspend),
653 DEVMETHOD(device_resume, bus_generic_resume),
654
655 /* Bus interface */
656 DEVMETHOD(bus_print_child, pccard_print_child),
657 DEVMETHOD(bus_driver_added, bus_generic_driver_added),
658 DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource),
659 DEVMETHOD(bus_release_resource, bus_generic_release_resource),
660 DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
661 DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
662 DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
663 DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
664 DEVMETHOD(bus_set_resource, pccard_set_resource),
665 DEVMETHOD(bus_get_resource, pccard_get_resource),
666 DEVMETHOD(bus_delete_resource, pccard_delete_resource),
667
668 /* Card Interface */
669 DEVMETHOD(card_set_res_flags, pccard_set_res_flags),
670 DEVMETHOD(card_set_memory_offset, pccard_set_memory_offset),
671 DEVMETHOD(card_get_type, pccard_card_gettype),
672 DEVMETHOD(card_attach_card, pccard_attach_card),
673 DEVMETHOD(card_detach_card, pccard_detach_card),
674
751 { 0, 0 }
752};
753
754static driver_t pccard_driver = {
755 "pccard",
756 pccard_methods,
757 1, /* no softc */
758};
759
760devclass_t pccard_devclass;
761
762DRIVER_MODULE(pccard, pcic, pccard_driver, pccard_devclass, 0, 0);
763DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0);
764DRIVER_MODULE(pccard, pccbb, pccard_driver, pccard_devclass, 0, 0);
765DRIVER_MODULE(pccard, tcic, pccard_driver, pccard_devclass, 0, 0);
675 { 0, 0 }
676};
677
678static driver_t pccard_driver = {
679 "pccard",
680 pccard_methods,
681 1, /* no softc */
682};
683
684devclass_t pccard_devclass;
685
686DRIVER_MODULE(pccard, pcic, pccard_driver, pccard_devclass, 0, 0);
687DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0);
688DRIVER_MODULE(pccard, pccbb, pccard_driver, pccard_devclass, 0, 0);
689DRIVER_MODULE(pccard, tcic, pccard_driver, pccard_devclass, 0, 0);