diff options
Diffstat (limited to 'drivers/net/pcmcia/ibmtr_cs.c')
-rw-r--r-- | drivers/net/pcmcia/ibmtr_cs.c | 121 |
1 files changed, 46 insertions, 75 deletions
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index b9c7e39576f5..b8fe70b85641 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
@@ -105,15 +105,15 @@ MODULE_LICENSE("GPL"); | |||
105 | 105 | ||
106 | /*====================================================================*/ | 106 | /*====================================================================*/ |
107 | 107 | ||
108 | static void ibmtr_config(dev_link_t *link); | 108 | static int ibmtr_config(struct pcmcia_device *link); |
109 | static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase); | 109 | static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase); |
110 | static void ibmtr_release(dev_link_t *link); | 110 | static void ibmtr_release(struct pcmcia_device *link); |
111 | static void ibmtr_detach(struct pcmcia_device *p_dev); | 111 | static void ibmtr_detach(struct pcmcia_device *p_dev); |
112 | 112 | ||
113 | /*====================================================================*/ | 113 | /*====================================================================*/ |
114 | 114 | ||
115 | typedef struct ibmtr_dev_t { | 115 | typedef struct ibmtr_dev_t { |
116 | dev_link_t link; | 116 | struct pcmcia_device *p_dev; |
117 | struct net_device *dev; | 117 | struct net_device *dev; |
118 | dev_node_t node; | 118 | dev_node_t node; |
119 | window_handle_t sram_win_handle; | 119 | window_handle_t sram_win_handle; |
@@ -138,12 +138,11 @@ static struct ethtool_ops netdev_ethtool_ops = { | |||
138 | 138 | ||
139 | ======================================================================*/ | 139 | ======================================================================*/ |
140 | 140 | ||
141 | static int ibmtr_attach(struct pcmcia_device *p_dev) | 141 | static int ibmtr_attach(struct pcmcia_device *link) |
142 | { | 142 | { |
143 | ibmtr_dev_t *info; | 143 | ibmtr_dev_t *info; |
144 | dev_link_t *link; | ||
145 | struct net_device *dev; | 144 | struct net_device *dev; |
146 | 145 | ||
147 | DEBUG(0, "ibmtr_attach()\n"); | 146 | DEBUG(0, "ibmtr_attach()\n"); |
148 | 147 | ||
149 | /* Create new token-ring device */ | 148 | /* Create new token-ring device */ |
@@ -156,7 +155,7 @@ static int ibmtr_attach(struct pcmcia_device *p_dev) | |||
156 | return -ENOMEM; | 155 | return -ENOMEM; |
157 | } | 156 | } |
158 | 157 | ||
159 | link = &info->link; | 158 | info->p_dev = link; |
160 | link->priv = info; | 159 | link->priv = info; |
161 | info->ti = netdev_priv(dev); | 160 | info->ti = netdev_priv(dev); |
162 | 161 | ||
@@ -167,21 +166,14 @@ static int ibmtr_attach(struct pcmcia_device *p_dev) | |||
167 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 166 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
168 | link->irq.Handler = &tok_interrupt; | 167 | link->irq.Handler = &tok_interrupt; |
169 | link->conf.Attributes = CONF_ENABLE_IRQ; | 168 | link->conf.Attributes = CONF_ENABLE_IRQ; |
170 | link->conf.Vcc = 50; | ||
171 | link->conf.IntType = INT_MEMORY_AND_IO; | 169 | link->conf.IntType = INT_MEMORY_AND_IO; |
172 | link->conf.Present = PRESENT_OPTION; | 170 | link->conf.Present = PRESENT_OPTION; |
173 | 171 | ||
174 | link->irq.Instance = info->dev = dev; | 172 | link->irq.Instance = info->dev = dev; |
175 | |||
176 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | ||
177 | |||
178 | link->handle = p_dev; | ||
179 | p_dev->instance = link; | ||
180 | 173 | ||
181 | link->state |= DEV_PRESENT; | 174 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
182 | ibmtr_config(link); | ||
183 | 175 | ||
184 | return 0; | 176 | return ibmtr_config(link); |
185 | } /* ibmtr_attach */ | 177 | } /* ibmtr_attach */ |
186 | 178 | ||
187 | /*====================================================================== | 179 | /*====================================================================== |
@@ -193,23 +185,22 @@ static int ibmtr_attach(struct pcmcia_device *p_dev) | |||
193 | 185 | ||
194 | ======================================================================*/ | 186 | ======================================================================*/ |
195 | 187 | ||
196 | static void ibmtr_detach(struct pcmcia_device *p_dev) | 188 | static void ibmtr_detach(struct pcmcia_device *link) |
197 | { | 189 | { |
198 | dev_link_t *link = dev_to_instance(p_dev); | ||
199 | struct ibmtr_dev_t *info = link->priv; | 190 | struct ibmtr_dev_t *info = link->priv; |
200 | struct net_device *dev = info->dev; | 191 | struct net_device *dev = info->dev; |
201 | 192 | ||
202 | DEBUG(0, "ibmtr_detach(0x%p)\n", link); | 193 | DEBUG(0, "ibmtr_detach(0x%p)\n", link); |
203 | 194 | ||
204 | if (link->dev) | 195 | if (link->dev_node) |
205 | unregister_netdev(dev); | 196 | unregister_netdev(dev); |
206 | 197 | ||
207 | { | 198 | { |
208 | struct tok_info *ti = netdev_priv(dev); | 199 | struct tok_info *ti = netdev_priv(dev); |
209 | del_timer_sync(&(ti->tr_timer)); | 200 | del_timer_sync(&(ti->tr_timer)); |
210 | } | 201 | } |
211 | if (link->state & DEV_CONFIG) | 202 | |
212 | ibmtr_release(link); | 203 | ibmtr_release(link); |
213 | 204 | ||
214 | free_netdev(dev); | 205 | free_netdev(dev); |
215 | kfree(info); | 206 | kfree(info); |
@@ -226,9 +217,8 @@ static void ibmtr_detach(struct pcmcia_device *p_dev) | |||
226 | #define CS_CHECK(fn, ret) \ | 217 | #define CS_CHECK(fn, ret) \ |
227 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
228 | 219 | ||
229 | static void ibmtr_config(dev_link_t *link) | 220 | static int ibmtr_config(struct pcmcia_device *link) |
230 | { | 221 | { |
231 | client_handle_t handle = link->handle; | ||
232 | ibmtr_dev_t *info = link->priv; | 222 | ibmtr_dev_t *info = link->priv; |
233 | struct net_device *dev = info->dev; | 223 | struct net_device *dev = info->dev; |
234 | struct tok_info *ti = netdev_priv(dev); | 224 | struct tok_info *ti = netdev_priv(dev); |
@@ -246,29 +236,25 @@ static void ibmtr_config(dev_link_t *link) | |||
246 | tuple.TupleDataMax = 64; | 236 | tuple.TupleDataMax = 64; |
247 | tuple.TupleOffset = 0; | 237 | tuple.TupleOffset = 0; |
248 | tuple.DesiredTuple = CISTPL_CONFIG; | 238 | tuple.DesiredTuple = CISTPL_CONFIG; |
249 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | 239 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); |
250 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | 240 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); |
251 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); | 241 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); |
252 | link->conf.ConfigBase = parse.config.base; | 242 | link->conf.ConfigBase = parse.config.base; |
253 | |||
254 | /* Configure card */ | ||
255 | link->state |= DEV_CONFIG; | ||
256 | |||
257 | link->conf.ConfigIndex = 0x61; | 243 | link->conf.ConfigIndex = 0x61; |
258 | 244 | ||
259 | /* Determine if this is PRIMARY or ALTERNATE. */ | 245 | /* Determine if this is PRIMARY or ALTERNATE. */ |
260 | 246 | ||
261 | /* Try PRIMARY card at 0xA20-0xA23 */ | 247 | /* Try PRIMARY card at 0xA20-0xA23 */ |
262 | link->io.BasePort1 = 0xA20; | 248 | link->io.BasePort1 = 0xA20; |
263 | i = pcmcia_request_io(link->handle, &link->io); | 249 | i = pcmcia_request_io(link, &link->io); |
264 | if (i != CS_SUCCESS) { | 250 | if (i != CS_SUCCESS) { |
265 | /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */ | 251 | /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */ |
266 | link->io.BasePort1 = 0xA24; | 252 | link->io.BasePort1 = 0xA24; |
267 | CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io)); | 253 | CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io)); |
268 | } | 254 | } |
269 | dev->base_addr = link->io.BasePort1; | 255 | dev->base_addr = link->io.BasePort1; |
270 | 256 | ||
271 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq)); | 257 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); |
272 | dev->irq = link->irq.AssignedIRQ; | 258 | dev->irq = link->irq.AssignedIRQ; |
273 | ti->irq = link->irq.AssignedIRQ; | 259 | ti->irq = link->irq.AssignedIRQ; |
274 | ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq); | 260 | ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq); |
@@ -279,7 +265,7 @@ static void ibmtr_config(dev_link_t *link) | |||
279 | req.Base = 0; | 265 | req.Base = 0; |
280 | req.Size = 0x2000; | 266 | req.Size = 0x2000; |
281 | req.AccessSpeed = 250; | 267 | req.AccessSpeed = 250; |
282 | CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win)); | 268 | CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &link->win)); |
283 | 269 | ||
284 | mem.CardOffset = mmiobase; | 270 | mem.CardOffset = mmiobase; |
285 | mem.Page = 0; | 271 | mem.Page = 0; |
@@ -292,7 +278,7 @@ static void ibmtr_config(dev_link_t *link) | |||
292 | req.Base = 0; | 278 | req.Base = 0; |
293 | req.Size = sramsize * 1024; | 279 | req.Size = sramsize * 1024; |
294 | req.AccessSpeed = 250; | 280 | req.AccessSpeed = 250; |
295 | CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &info->sram_win_handle)); | 281 | CS_CHECK(RequestWindow, pcmcia_request_window(&link, &req, &info->sram_win_handle)); |
296 | 282 | ||
297 | mem.CardOffset = srambase; | 283 | mem.CardOffset = srambase; |
298 | mem.Page = 0; | 284 | mem.Page = 0; |
@@ -302,21 +288,20 @@ static void ibmtr_config(dev_link_t *link) | |||
302 | ti->sram_virt = ioremap(req.Base, req.Size); | 288 | ti->sram_virt = ioremap(req.Base, req.Size); |
303 | ti->sram_phys = req.Base; | 289 | ti->sram_phys = req.Base; |
304 | 290 | ||
305 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); | 291 | CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf)); |
306 | 292 | ||
307 | /* Set up the Token-Ring Controller Configuration Register and | 293 | /* Set up the Token-Ring Controller Configuration Register and |
308 | turn on the card. Check the "Local Area Network Credit Card | 294 | turn on the card. Check the "Local Area Network Credit Card |
309 | Adapters Technical Reference" SC30-3585 for this info. */ | 295 | Adapters Technical Reference" SC30-3585 for this info. */ |
310 | ibmtr_hw_setup(dev, mmiobase); | 296 | ibmtr_hw_setup(dev, mmiobase); |
311 | 297 | ||
312 | link->dev = &info->node; | 298 | link->dev_node = &info->node; |
313 | link->state &= ~DEV_CONFIG_PENDING; | 299 | SET_NETDEV_DEV(dev, &handle_to_dev(link)); |
314 | SET_NETDEV_DEV(dev, &handle_to_dev(handle)); | ||
315 | 300 | ||
316 | i = ibmtr_probe_card(dev); | 301 | i = ibmtr_probe_card(dev); |
317 | if (i != 0) { | 302 | if (i != 0) { |
318 | printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n"); | 303 | printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n"); |
319 | link->dev = NULL; | 304 | link->dev_node = NULL; |
320 | goto failed; | 305 | goto failed; |
321 | } | 306 | } |
322 | 307 | ||
@@ -330,12 +315,13 @@ static void ibmtr_config(dev_link_t *link) | |||
330 | for (i = 0; i < TR_ALEN; i++) | 315 | for (i = 0; i < TR_ALEN; i++) |
331 | printk("%02X", dev->dev_addr[i]); | 316 | printk("%02X", dev->dev_addr[i]); |
332 | printk("\n"); | 317 | printk("\n"); |
333 | return; | 318 | return 0; |
334 | 319 | ||
335 | cs_failed: | 320 | cs_failed: |
336 | cs_error(link->handle, last_fn, last_ret); | 321 | cs_error(link, last_fn, last_ret); |
337 | failed: | 322 | failed: |
338 | ibmtr_release(link); | 323 | ibmtr_release(link); |
324 | return -ENODEV; | ||
339 | } /* ibmtr_config */ | 325 | } /* ibmtr_config */ |
340 | 326 | ||
341 | /*====================================================================== | 327 | /*====================================================================== |
@@ -346,56 +332,41 @@ failed: | |||
346 | 332 | ||
347 | ======================================================================*/ | 333 | ======================================================================*/ |
348 | 334 | ||
349 | static void ibmtr_release(dev_link_t *link) | 335 | static void ibmtr_release(struct pcmcia_device *link) |
350 | { | 336 | { |
351 | ibmtr_dev_t *info = link->priv; | 337 | ibmtr_dev_t *info = link->priv; |
352 | struct net_device *dev = info->dev; | 338 | struct net_device *dev = info->dev; |
353 | |||
354 | DEBUG(0, "ibmtr_release(0x%p)\n", link); | ||
355 | 339 | ||
356 | pcmcia_release_configuration(link->handle); | 340 | DEBUG(0, "ibmtr_release(0x%p)\n", link); |
357 | pcmcia_release_io(link->handle, &link->io); | ||
358 | pcmcia_release_irq(link->handle, &link->irq); | ||
359 | if (link->win) { | ||
360 | struct tok_info *ti = netdev_priv(dev); | ||
361 | iounmap(ti->mmio); | ||
362 | pcmcia_release_window(link->win); | ||
363 | pcmcia_release_window(info->sram_win_handle); | ||
364 | } | ||
365 | 341 | ||
366 | link->state &= ~DEV_CONFIG; | 342 | if (link->win) { |
343 | struct tok_info *ti = netdev_priv(dev); | ||
344 | iounmap(ti->mmio); | ||
345 | pcmcia_release_window(info->sram_win_handle); | ||
346 | } | ||
347 | pcmcia_disable_device(link); | ||
367 | } | 348 | } |
368 | 349 | ||
369 | static int ibmtr_suspend(struct pcmcia_device *p_dev) | 350 | static int ibmtr_suspend(struct pcmcia_device *link) |
370 | { | 351 | { |
371 | dev_link_t *link = dev_to_instance(p_dev); | ||
372 | ibmtr_dev_t *info = link->priv; | 352 | ibmtr_dev_t *info = link->priv; |
373 | struct net_device *dev = info->dev; | 353 | struct net_device *dev = info->dev; |
374 | 354 | ||
375 | link->state |= DEV_SUSPEND; | 355 | if (link->open) |
376 | if (link->state & DEV_CONFIG) { | 356 | netif_device_detach(dev); |
377 | if (link->open) | ||
378 | netif_device_detach(dev); | ||
379 | pcmcia_release_configuration(link->handle); | ||
380 | } | ||
381 | 357 | ||
382 | return 0; | 358 | return 0; |
383 | } | 359 | } |
384 | 360 | ||
385 | static int ibmtr_resume(struct pcmcia_device *p_dev) | 361 | static int ibmtr_resume(struct pcmcia_device *link) |
386 | { | 362 | { |
387 | dev_link_t *link = dev_to_instance(p_dev); | ||
388 | ibmtr_dev_t *info = link->priv; | 363 | ibmtr_dev_t *info = link->priv; |
389 | struct net_device *dev = info->dev; | 364 | struct net_device *dev = info->dev; |
390 | 365 | ||
391 | link->state &= ~DEV_SUSPEND; | 366 | if (link->open) { |
392 | if (link->state & DEV_CONFIG) { | 367 | ibmtr_probe(dev); /* really? */ |
393 | pcmcia_request_configuration(link->handle, &link->conf); | 368 | netif_device_attach(dev); |
394 | if (link->open) { | 369 | } |
395 | ibmtr_probe(dev); /* really? */ | ||
396 | netif_device_attach(dev); | ||
397 | } | ||
398 | } | ||
399 | 370 | ||
400 | return 0; | 371 | return 0; |
401 | } | 372 | } |