card_if.m revision 139749
1#-
2# Copyright (c) 1999 M. Warner Losh.
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# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26# $FreeBSD: head/sys/dev/pccard/card_if.m 139749 2005-01-06 01:43:34Z imp $
27#
28
29#include <sys/bus.h>
30#include <machine/bus.h>
31#include <dev/pccard/pccardvar.h>
32
33INTERFACE card;
34
35# WARNING: THIS FILE IS USED BY BOTH OLDCARD AND NEWCARD.  MAKE SURE
36# YOU TEST BOTH KERNELS IF CHANGING THIS FILE.
37
38#
39# Companion interface for pccard.  We need to set attributes for memory
40# and i/o port mappings (as well as other types of attributes) that have
41# a well defined meaning inside the pccard/cardbus system.  The bus
42# methods are inadequate for this because this must be done at the time the
43# resources are set for the device, which predates their activation.  Also,
44# the driver activating the resources doesn't necessarily know or need to know
45# these attributes.
46#
47METHOD int set_res_flags {
48	device_t dev;
49	device_t child;
50	int	 restype;
51	int	 rid;
52	u_long	 value;
53};
54
55METHOD int get_res_flags {
56	device_t dev;
57	device_t child;
58	int	 restype;
59	int	 rid;
60	u_long	 *value;
61};
62
63#
64# Sets the memory offset of the pccard bridge's window into attribute
65# or common memory space.
66#
67METHOD int set_memory_offset {
68	device_t  dev;
69	device_t  child;
70	int	  rid;
71	u_int32_t cardaddr;
72	u_int32_t *deltap;
73}
74
75METHOD int get_memory_offset {
76	device_t  dev;
77	device_t  child;
78	int	  rid;
79	u_int32_t *offset;
80}
81
82#
83# pccard bridges call this method to initate the attachment of a card
84#
85METHOD int attach_card {
86	device_t  dev;
87}
88
89#
90# pccard bridges call this to detach a card.
91#
92METHOD int detach_card {
93	device_t  dev;
94}
95
96#
97# Returns the function number for this device.
98#
99METHOD int get_function {
100	device_t  dev;
101	device_t  child;
102	int	  *func;
103}
104
105#
106# Activates (and powers up if necessary) the card's nth function
107# since each function gets its own device, there is no need to
108# to specify a function number
109#
110METHOD int activate_function {
111	device_t  dev;
112	device_t  child;
113}
114
115METHOD int deactivate_function {
116	device_t  dev;
117	device_t  child;
118}
119
120#
121# Compatibility methods for OLDCARD drivers.  We use these routines to make
122# it possible to call the OLDCARD driver's probe routine in the context that
123# it expects.  For OLDCARD these are implemented as pass throughs to the
124# device_{probe,attach} routines.  For NEWCARD they are implemented such
125# such that probe becomes strictly a matching routine and attach does both
126# the old probe and old attach.
127#
128# compat devices should use the following:
129#
130#	/* Device interface */
131#	DEVMETHOD(device_probe),	pccard_compat_probe),
132#	DEVMETHOD(device_attach),	pccard_compat_attach),
133#	/* Card interface */
134#	DEVMETHOD(card_compat_match,	foo_match),	/* newly written */
135#	DEVMETHOD(card_compat_probe,	foo_probe),	/* old probe */
136#	DEVMETHOD(card_compat_attach,	foo_attach),	/* old attach */
137#
138# This will allow a single driver binary image to be used for both
139# OLDCARD and NEWCARD.
140#
141# Drivers wishing to not retain OLDCARD compatibility needn't do this.
142#
143# The compat_do_* versions are so that we can make the pccard_compat_probe
144# and _attach static lines and have the bus system pick the right version
145# to use so we don't enshrine pccard_* symbols in the driver's module.
146#
147METHOD int compat_probe {
148	device_t dev;
149}
150
151METHOD int compat_attach {
152	device_t dev;
153}
154
155CODE {
156	static int null_do_probe(device_t bus, device_t dev)
157	{
158		return (CARD_COMPAT_DO_PROBE(device_get_parent(bus), dev));
159	}
160
161	static int null_do_attach(device_t bus, device_t dev)
162	{
163		return (CARD_COMPAT_DO_ATTACH(device_get_parent(bus), dev));
164	}
165}
166
167METHOD int compat_do_probe {
168	device_t bus;
169	device_t dev;
170} DEFAULT null_do_probe;
171
172METHOD int compat_do_attach {
173	device_t bus;
174	device_t dev;
175} DEFAULT null_do_attach;
176
177#
178# Find "dev" in the passed table of devices.  Return it or NULL.
179#
180METHOD struct pccard_product * do_product_lookup {
181	device_t bus;
182	device_t dev;
183	const struct pccard_product *tab;
184	size_t ent_size;
185	pccard_product_match_fn matchfn;
186}
187
188#
189# Helper method for the above.  When a compatibility driver is converted,
190# one must write a match routine.  This routine is unused on OLDCARD but
191# is used as a discriminator for NEWCARD.
192#
193METHOD int compat_match {
194	device_t dev;
195}
196