aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/pcmcia/ipwireless/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/pcmcia/ipwireless/main.c')
-rw-r--r--drivers/char/pcmcia/ipwireless/main.c103
1 files changed, 22 insertions, 81 deletions
diff --git a/drivers/char/pcmcia/ipwireless/main.c b/drivers/char/pcmcia/ipwireless/main.c
index 5216fce0c62..263a18f381b 100644
--- a/drivers/char/pcmcia/ipwireless/main.c
+++ b/drivers/char/pcmcia/ipwireless/main.c
@@ -79,14 +79,32 @@ static void signalled_reboot_callback(void *callback_data)
79 schedule_work(&ipw->work_reboot); 79 schedule_work(&ipw->work_reboot);
80} 80}
81 81
82static int ipwireless_ioprobe(struct pcmcia_device *p_dev,
83 cistpl_cftable_entry_t *cfg,
84 cistpl_cftable_entry_t *dflt,
85 unsigned int vcc,
86 void *priv_data)
87{
88 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
89 p_dev->io.BasePort1 = cfg->io.win[0].base;
90 p_dev->io.NumPorts1 = cfg->io.win[0].len;
91 p_dev->io.IOAddrLines = 16;
92
93 p_dev->irq.IRQInfo1 = cfg->irq.IRQInfo1;
94
95 /* 0x40 causes it to generate level mode interrupts. */
96 /* 0x04 enables IREQ pin. */
97 p_dev->conf.ConfigIndex = cfg->index | 0x44;
98 return pcmcia_request_io(p_dev, &p_dev->io);
99}
100
82static int config_ipwireless(struct ipw_dev *ipw) 101static int config_ipwireless(struct ipw_dev *ipw)
83{ 102{
84 struct pcmcia_device *link = ipw->link; 103 struct pcmcia_device *link = ipw->link;
85 int ret; 104 int ret = 0;
86 tuple_t tuple; 105 tuple_t tuple;
87 unsigned short buf[64]; 106 unsigned short buf[64];
88 cisparse_t parse; 107 cisparse_t parse;
89 unsigned short cor_value;
90 memreq_t memreq_attr_memory; 108 memreq_t memreq_attr_memory;
91 memreq_t memreq_common_memory; 109 memreq_t memreq_common_memory;
92 110
@@ -97,103 +115,26 @@ static int config_ipwireless(struct ipw_dev *ipw)
97 tuple.TupleDataMax = sizeof(buf); 115 tuple.TupleDataMax = sizeof(buf);
98 tuple.TupleOffset = 0; 116 tuple.TupleOffset = 0;
99 117
100 tuple.DesiredTuple = RETURN_FIRST_TUPLE; 118 ret = pcmcia_loop_config(link, ipwireless_ioprobe, NULL);
101
102 ret = pcmcia_get_first_tuple(link, &tuple);
103
104 while (ret == 0) {
105 ret = pcmcia_get_tuple_data(link, &tuple);
106
107 if (ret != 0) {
108 cs_error(link, GetTupleData, ret);
109 goto exit0;
110 }
111 ret = pcmcia_get_next_tuple(link, &tuple);
112 }
113
114 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
115
116 ret = pcmcia_get_first_tuple(link, &tuple);
117
118 if (ret != 0) {
119 cs_error(link, GetFirstTuple, ret);
120 goto exit0;
121 }
122
123 ret = pcmcia_get_tuple_data(link, &tuple);
124
125 if (ret != 0) {
126 cs_error(link, GetTupleData, ret);
127 goto exit0;
128 }
129
130 ret = pcmcia_parse_tuple(&tuple, &parse);
131
132 if (ret != 0) {
133 cs_error(link, ParseTuple, ret);
134 goto exit0;
135 }
136
137 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
138 link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
139 link->io.NumPorts1 = parse.cftable_entry.io.win[0].len;
140 link->io.IOAddrLines = 16;
141
142 link->irq.IRQInfo1 = parse.cftable_entry.irq.IRQInfo1;
143
144 /* 0x40 causes it to generate level mode interrupts. */
145 /* 0x04 enables IREQ pin. */
146 cor_value = parse.cftable_entry.index | 0x44;
147 link->conf.ConfigIndex = cor_value;
148
149 /* IRQ and I/O settings */
150 tuple.DesiredTuple = CISTPL_CONFIG;
151
152 ret = pcmcia_get_first_tuple(link, &tuple);
153
154 if (ret != 0) { 119 if (ret != 0) {
155 cs_error(link, GetFirstTuple, ret); 120 cs_error(link, RequestIO, ret);
156 goto exit0;
157 }
158
159 ret = pcmcia_get_tuple_data(link, &tuple);
160
161 if (ret != 0) {
162 cs_error(link, GetTupleData, ret);
163 goto exit0; 121 goto exit0;
164 } 122 }
165 123
166 ret = pcmcia_parse_tuple(&tuple, &parse);
167
168 if (ret != 0) {
169 cs_error(link, GetTupleData, ret);
170 goto exit0;
171 }
172 link->conf.Attributes = CONF_ENABLE_IRQ; 124 link->conf.Attributes = CONF_ENABLE_IRQ;
173 link->conf.ConfigBase = parse.config.base;
174 link->conf.Present = parse.config.rmask[0];
175 link->conf.IntType = INT_MEMORY_AND_IO; 125 link->conf.IntType = INT_MEMORY_AND_IO;
176 126
177 link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; 127 link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT;
178 link->irq.Handler = ipwireless_interrupt; 128 link->irq.Handler = ipwireless_interrupt;
179 link->irq.Instance = ipw->hardware; 129 link->irq.Instance = ipw->hardware;
180 130
181 ret = pcmcia_request_io(link, &link->io);
182
183 if (ret != 0) {
184 cs_error(link, RequestIO, ret);
185 goto exit0;
186 }
187
188 request_region(link->io.BasePort1, link->io.NumPorts1, 131 request_region(link->io.BasePort1, link->io.NumPorts1,
189 IPWIRELESS_PCCARD_NAME); 132 IPWIRELESS_PCCARD_NAME);
190 133
191 /* memory settings */ 134 /* memory settings */
192
193 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; 135 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
194 136
195 ret = pcmcia_get_first_tuple(link, &tuple); 137 ret = pcmcia_get_first_tuple(link, &tuple);
196
197 if (ret != 0) { 138 if (ret != 0) {
198 cs_error(link, GetFirstTuple, ret); 139 cs_error(link, GetFirstTuple, ret);
199 goto exit1; 140 goto exit1;