pccardvarp.h revision 170163
1/*-
2 * Copyright (c) 2005, 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 unmodified, this list of conditions, and the following
10 *    disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD: head/sys/dev/pccard/pccardvarp.h 170163 2007-05-31 19:29:20Z piso $
28 */
29
30#ifndef _PCCARD_PCCARDVARP_H
31#define _PCCARD_PCCARDVARP_H
32
33/* pccard itself */
34
35#define PCCARD_MEM_PAGE_SIZE		1024
36
37#define PCCARD_CFE_MWAIT_REQUIRED	0x0001
38#define PCCARD_CFE_RDYBSY_ACTIVE	0x0002
39#define PCCARD_CFE_WP_ACTIVE		0x0004
40#define PCCARD_CFE_BVD_ACTIVE		0x0008
41#define PCCARD_CFE_IO8			0x0010
42#define PCCARD_CFE_IO16			0x0020
43#define PCCARD_CFE_IRQSHARE		0x0040
44#define PCCARD_CFE_IRQPULSE		0x0080
45#define PCCARD_CFE_IRQLEVEL		0x0100
46#define PCCARD_CFE_POWERDOWN		0x0200
47#define PCCARD_CFE_READONLY		0x0400
48#define PCCARD_CFE_AUDIO		0x0800
49
50struct pccard_config_entry {
51	int		number;
52	uint32_t	flags;
53	int		iftype;
54	int		num_iospace;
55
56	/*
57	 * The card will only decode this mask in any case, so we can
58	 * do dynamic allocation with this in mind, in case the suggestions
59	 * below are no good.
60	 */
61	u_long		iomask;
62	struct {
63		u_long	length;
64		u_long	start;
65	} iospace[4];		/* XXX this could be as high as 16 */
66	uint16_t	irqmask;
67	int		num_memspace;
68	struct {
69		u_long	length;
70		u_long	cardaddr;
71		u_long	hostaddr;
72	} memspace[2];		/* XXX this could be as high as 8 */
73	int		maxtwins;
74	STAILQ_ENTRY(pccard_config_entry) cfe_list;
75};
76
77struct pccard_funce_disk {
78	int pfd_interface;
79};
80
81struct pccard_funce_lan {
82	int pfl_nidlen;
83	uint8_t pfl_nid[8];
84};
85
86union pccard_funce {
87	struct pccard_funce_disk pfv_disk;
88	struct pccard_funce_lan pfv_lan;
89};
90
91struct pccard_function {
92	/* read off the card */
93	int		number;
94	int		function;
95	int		last_config_index;
96	uint32_t	ccr_base;	/* Offset with card's memory */
97	uint32_t	ccr_mask;
98	struct resource *ccr_res;
99	int		ccr_rid;
100	STAILQ_HEAD(, pccard_config_entry) cfe_head;
101	STAILQ_ENTRY(pccard_function) pf_list;
102	/* run-time state */
103	struct pccard_softc *sc;
104	struct pccard_config_entry *cfe;
105	struct pccard_mem_handle pf_pcmh;
106	device_t	dev;
107#define	pf_ccrt		pf_pcmh.memt
108#define	pf_ccrh		pf_pcmh.memh
109#define	pf_ccr_realsize	pf_pcmh.realsize
110	uint32_t	pf_ccr_offset;	/* Offset from ccr_base of CIS */
111	int		pf_ccr_window;
112	bus_addr_t	pf_mfc_iobase;
113	bus_addr_t	pf_mfc_iomax;
114	int		pf_flags;
115	driver_filter_t	*intr_filter;
116	driver_intr_t	*intr_handler;
117	void		*intr_handler_arg;
118	void		*intr_handler_cookie;
119
120	union pccard_funce pf_funce; /* CISTPL_FUNCE */
121#define pf_funce_disk_interface pf_funce.pfv_disk.pfd_interface
122#define pf_funce_lan_nid pf_funce.pfv_lan.pfl_nid
123#define pf_funce_lan_nidlen pf_funce.pfv_lan.pfl_nidlen
124};
125
126/* pf_flags */
127#define	PFF_ENABLED	0x0001		/* function is enabled */
128
129struct pccard_card {
130	int		cis1_major;
131	int		cis1_minor;
132	/* XXX waste of space? */
133	char		cis1_info_buf[256];
134	char		*cis1_info[4];
135	/*
136	 * Use int32_t for manufacturer and product so that they can
137	 * hold the id value found in card CIS and special value that
138	 * indicates no id was found.
139	 */
140	int32_t		manufacturer;
141#define	PCMCIA_VENDOR_INVALID	-1
142	int32_t		product;
143#define	PCMCIA_PRODUCT_INVALID		-1
144	int16_t		prodext;
145	uint16_t	error;
146#define	PCMCIA_CIS_INVALID		{ NULL, NULL, NULL, NULL }
147	STAILQ_HEAD(, pccard_function) pf_head;
148};
149
150/* More later? */
151struct pccard_ivar {
152	struct resource_list resources;
153	struct pccard_function *pf;
154};
155
156struct cis_buffer
157{
158	size_t	len;			/* Actual length of the CIS */
159	uint8_t buffer[2040];		/* small enough to be 2k */
160};
161
162struct pccard_softc {
163	device_t		dev;
164	/* this stuff is for the socket */
165
166	/* this stuff is for the card */
167	struct pccard_card card;
168	int		sc_enabled_count;	/* num functions enabled */
169	struct cdev *cisdev;
170	int	cis_open;
171	struct cis_buffer *cis;
172};
173
174struct pccard_cis_quirk {
175	int32_t manufacturer;
176	int32_t product;
177	char *cis1_info[4];
178	struct pccard_function *pf;
179	struct pccard_config_entry *cfe;
180};
181
182void	pccard_read_cis(struct pccard_softc *);
183void	pccard_check_cis_quirks(device_t);
184void	pccard_print_cis(device_t);
185int	pccard_scan_cis(device_t, device_t, pccard_scan_t, void *);
186
187int	pccard_device_create(struct pccard_softc *);
188int	pccard_device_destroy(struct pccard_softc *);
189
190#define PCCARD_SOFTC(d) (struct pccard_softc *) device_get_softc(d)
191#define PCCARD_IVAR(d) (struct pccard_ivar *) device_get_ivars(d)
192
193#endif /* _PCCARD_PCCARDVARP_H */
194