card_if.m revision 70715
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 70715 2001-01-06 18:04:55Z jon $
27#
28
29#include <sys/bus.h>
30
31INTERFACE card;
32
33#
34# Companion interface for pccard.  We need to set attributes for memory
35# and i/o port mappings (as well as other types of attributes) that have
36# a well defined meaning inside the pccard/cardbus system.  The bus
37# methods are inadequate for this because this must be done at the time the
38# resources are set for the device, which predates their activation.  Also,
39# the driver activating the resources doesn't necessarily know or need to know
40# these attributes.
41#
42METHOD int set_res_flags {
43	device_t dev;
44	device_t child;
45	int	 restype;
46	int	 rid;
47	u_long	 value;
48};
49
50METHOD int get_res_flags {
51	device_t dev;
52	device_t child;
53	int	 restype;
54	int	 rid;
55	u_long	 *value;
56};
57
58#
59# Sets the memory offset of the pccard bridge's window into attribute
60# or common memory space.
61#
62METHOD int set_memory_offset {
63	device_t  dev;
64	device_t  child;
65        int	  rid;
66        u_int32_t cardaddr;
67	u_int32_t *offsetp;
68}
69
70METHOD int get_memory_offset {
71	device_t  dev;
72	device_t  child;
73        int	  rid;
74        u_int32_t *offset;
75}
76
77#
78# pccard bridges call this method to initate the attachment of a card
79#
80METHOD int attach_card {
81	device_t  dev;
82}
83
84#
85# pccard bridges call this to detach a card.
86#
87METHOD int detach_card {
88	device_t  dev;
89	int	  flags;
90}
91
92HEADER {
93	#define DETACH_FORCE 0x01
94	#define DETACH_NOWARN 0x02
95}
96
97#
98# Returns the type of card this is.  Maybe we don't need this.
99#
100METHOD int get_type {
101	device_t  dev;
102	int	  *type;
103}
104
105#
106# Returns the function number for this device.
107#
108METHOD int get_function {
109	device_t  dev;
110	device_t  child;
111	int	  *func;
112}
113
114#
115# Activates (and powers up if necessary) the card's nth function
116# since each function gets its own device, there is no need to
117# to specify a function number
118#
119METHOD int activate_function {
120	device_t  dev;
121	device_t  child;
122}
123
124METHOD int deactivate_function {
125	device_t  dev;
126	device_t  child;
127}
128
129#
130# Compatibility methods for OLDCARD drivers.  We use these routines to make
131# it possible to call the OLDCARD driver's probe routine in the context that
132# it expects.  For OLDCARD these are implemented as pass throughs to the
133# device_{probe,attach} routines.  For NEWCARD they are implemented such
134# such that probe becomes strictly a matching routine and attach does both
135# the old probe and old attach.
136#
137# compat devices should use the following:
138#
139#	/* Device interface */
140#	DEVMETHOD(device_probe),	pccard_compat_probe),
141#	DEVMETHOD(device_attach),	pccard_compat_attach),
142#	/* Card interface */
143#	DEVMETHOD(card_compat_match,	foo_match),	/* newly written */
144#	DEVMETHOD(card_compat_probe,	foo_probe),	/* old probe */
145#	DEVMETHOD(card_compat_attach,	foo_attach),	/* old attach */
146#
147# This will allow a single driver binary image to be used for both
148# OLDCARD and NEWCARD.
149#
150# Drivers wishing to not retain OLDCARD compatibility needn't do this.
151#
152METHOD int compat_probe {
153	device_t dev;
154}
155
156METHOD int compat_attach {
157	device_t dev;
158}
159
160#
161# Helper method for the above.  When a compatibility driver is converted,
162# one must write a match routine.  This routine is unused on OLDCARD but
163# is used as a discriminator for NEWCARD.
164#
165METHOD int compat_match {
166	device_t dev;
167}
168
169#
170# Method for devices to ask its CIS-enabled parent bus for CIS info.
171# Device driver requests all tuples if type 'id', the routine places
172# 'nret' number of tuples in 'buff'.  Returns 0 if all tuples processed,
173# or an error code if processing was aborted.
174# Users of this method will be responsible for freeing the memory allocated
175# by calling the cis_free method.
176#
177
178HEADER {
179	struct cis_tupleinfo {
180		u_int8_t id;
181		int len;
182		char* data;
183	};
184};
185
186CODE  {
187	static int
188	null_cis_read(device_t dev, device_t child, u_int8_t id,
189		      struct cis_tupleinfo **buff, int* nret)
190	{
191		*nret = 0;
192		*buff = NULL;
193		return ENXIO;
194	}
195	static void
196	null_cis_free(device_t dev, struct cis_tupleinfo *buff, int* nret)
197	{
198		return;
199	}
200};
201
202
203METHOD int cis_read {
204	device_t dev;
205	device_t child;
206	u_int8_t id;
207	struct cis_tupleinfo **buff;
208	int* nret;
209} DEFAULT null_cis_read;
210
211METHOD int cis_free {
212	device_t dev;
213	struct cis_tupleinfo *buff;
214	int nret;
215} DEFAULT null_cis_free;
216
217
218