Deleted Added
full compact
pccardvarp.h (170163) pccardvarp.h (188219)
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 *
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 $
27 * $FreeBSD: head/sys/dev/pccard/pccardvarp.h 188219 2009-02-06 07:49:03Z imp $
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 {
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;
78 uint8_t pfd_interface;
79#define PFD_I_V_MASK 0x3
80#define PFD_I_V_NONE_REQUIRED 0x0
81#define PFD_I_V_REQ_MOD_ACC 0x1
82#define PFD_I_V_REQ_ACC 0x2
83#define PFD_I_V_REQ_ALWYS 0x1
84#define PFD_I_S 0x4 /* 0 rotating, 1 silicon */
85#define PFD_I_U 0x8 /* SN Uniq? */
86#define PFD_I_D 0x10 /* 0 - 1 drive, 1 - 2 drives */
87 uint8_t pfd_power;
88#define PFD_P_P0 0x1
89#define PFD_P_P1 0x2
90#define PFD_P_P2 0x4
91#define PFD_P_P3 0x8
92#define PFD_P_N 0x10 /* 3f7/377 excluded? */
93#define PFD_P_E 0x20 /* Index bit supported? */
94#define PFD_P_I 0x40 /* twincard */
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
95};
96
97struct pccard_funce_lan {
98 int pfl_nidlen;
99 uint8_t pfl_nid[8];
100};
101
102union pccard_funce {
103 struct pccard_funce_disk pfv_disk;
104 struct pccard_funce_lan pfv_lan;
105};
106
107struct pccard_function {
108 /* read off the card */
109 int number;
110 int function;
111 int last_config_index;
112 uint32_t ccr_base; /* Offset with card's memory */
113 uint32_t ccr_mask;
114 struct resource *ccr_res;
115 int ccr_rid;
116 STAILQ_HEAD(, pccard_config_entry) cfe_head;
117 STAILQ_ENTRY(pccard_function) pf_list;
118 /* run-time state */
119 struct pccard_softc *sc;
120 struct pccard_config_entry *cfe;
121 struct pccard_mem_handle pf_pcmh;
122 device_t dev;
123#define pf_ccrt pf_pcmh.memt
124#define pf_ccrh pf_pcmh.memh
125#define pf_ccr_realsize pf_pcmh.realsize
126 uint32_t pf_ccr_offset; /* Offset from ccr_base of CIS */
127 int pf_ccr_window;
128 bus_addr_t pf_mfc_iobase;
129 bus_addr_t pf_mfc_iomax;
130 int pf_flags;
131 driver_filter_t *intr_filter;
132 driver_intr_t *intr_handler;
133 void *intr_handler_arg;
134 void *intr_handler_cookie;
135
136 union pccard_funce pf_funce; /* CISTPL_FUNCE */
137#define pf_funce_disk_interface pf_funce.pfv_disk.pfd_interface
138#define pf_funce_disk_power pf_funce.pfv_disk.pfd_power
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 */
139#define pf_funce_lan_nid pf_funce.pfv_lan.pfl_nid
140#define pf_funce_lan_nidlen pf_funce.pfv_lan.pfl_nidlen
141};
142
143/* pf_flags */
144#define PFF_ENABLED 0x0001 /* function is enabled */
145
146struct pccard_card {
147 int cis1_major;
148 int cis1_minor;
149 /* XXX waste of space? */
150 char cis1_info_buf[256];
151 char *cis1_info[4];
152 /*
153 * Use int32_t for manufacturer and product so that they can
154 * hold the id value found in card CIS and special value that
155 * indicates no id was found.
156 */
157 int32_t manufacturer;
158#define PCMCIA_VENDOR_INVALID -1
159 int32_t product;
160#define PCMCIA_PRODUCT_INVALID -1
161 int16_t prodext;
162 uint16_t error;
163#define PCMCIA_CIS_INVALID { NULL, NULL, NULL, NULL }
164 STAILQ_HEAD(, pccard_function) pf_head;
165};
166
167/* More later? */
168struct pccard_ivar {
169 struct resource_list resources;
170 struct pccard_function *pf;
171};
172
173struct cis_buffer
174{
175 size_t len; /* Actual length of the CIS */
176 uint8_t buffer[2040]; /* small enough to be 2k */
177};
178
179struct pccard_softc {
180 device_t dev;
181 /* this stuff is for the socket */
182
183 /* this stuff is for the card */
184 struct pccard_card card;
185 int sc_enabled_count; /* num functions enabled */
186 struct cdev *cisdev;
187 int cis_open;
188 struct cis_buffer *cis;
189};
190
191struct pccard_cis_quirk {
192 int32_t manufacturer;
193 int32_t product;
194 char *cis1_info[4];
195 struct pccard_function *pf;
196 struct pccard_config_entry *cfe;
197};
198
199void pccard_read_cis(struct pccard_softc *);
200void pccard_check_cis_quirks(device_t);
201void pccard_print_cis(device_t);
202int pccard_scan_cis(device_t, device_t, pccard_scan_t, void *);
203
204int pccard_device_create(struct pccard_softc *);
205int pccard_device_destroy(struct pccard_softc *);
206
207#define PCCARD_SOFTC(d) (struct pccard_softc *) device_get_softc(d)
208#define PCCARD_IVAR(d) (struct pccard_ivar *) device_get_ivars(d)
209
210#endif /* _PCCARD_PCCARDVARP_H */