diff options
Diffstat (limited to 'drivers/net/plip.c')
| -rw-r--r-- | drivers/net/plip.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/net/plip.c b/drivers/net/plip.c index 71afb274498f..6bb085f54437 100644 --- a/drivers/net/plip.c +++ b/drivers/net/plip.c | |||
| @@ -138,9 +138,9 @@ static const unsigned int net_debug = NET_DEBUG; | |||
| 138 | #define PLIP_NIBBLE_WAIT 3000 | 138 | #define PLIP_NIBBLE_WAIT 3000 |
| 139 | 139 | ||
| 140 | /* Bottom halves */ | 140 | /* Bottom halves */ |
| 141 | static void plip_kick_bh(struct net_device *dev); | 141 | static void plip_kick_bh(struct work_struct *work); |
| 142 | static void plip_bh(struct net_device *dev); | 142 | static void plip_bh(struct work_struct *work); |
| 143 | static void plip_timer_bh(struct net_device *dev); | 143 | static void plip_timer_bh(struct work_struct *work); |
| 144 | 144 | ||
| 145 | /* Interrupt handler */ | 145 | /* Interrupt handler */ |
| 146 | static void plip_interrupt(int irq, void *dev_id); | 146 | static void plip_interrupt(int irq, void *dev_id); |
| @@ -207,9 +207,10 @@ struct plip_local { | |||
| 207 | 207 | ||
| 208 | struct net_local { | 208 | struct net_local { |
| 209 | struct net_device_stats enet_stats; | 209 | struct net_device_stats enet_stats; |
| 210 | struct net_device *dev; | ||
| 210 | struct work_struct immediate; | 211 | struct work_struct immediate; |
| 211 | struct work_struct deferred; | 212 | struct delayed_work deferred; |
| 212 | struct work_struct timer; | 213 | struct delayed_work timer; |
| 213 | struct plip_local snd_data; | 214 | struct plip_local snd_data; |
| 214 | struct plip_local rcv_data; | 215 | struct plip_local rcv_data; |
| 215 | struct pardevice *pardev; | 216 | struct pardevice *pardev; |
| @@ -306,11 +307,11 @@ plip_init_netdev(struct net_device *dev) | |||
| 306 | nl->nibble = PLIP_NIBBLE_WAIT; | 307 | nl->nibble = PLIP_NIBBLE_WAIT; |
| 307 | 308 | ||
| 308 | /* Initialize task queue structures */ | 309 | /* Initialize task queue structures */ |
| 309 | INIT_WORK(&nl->immediate, (void (*)(void *))plip_bh, dev); | 310 | INIT_WORK(&nl->immediate, plip_bh); |
| 310 | INIT_WORK(&nl->deferred, (void (*)(void *))plip_kick_bh, dev); | 311 | INIT_DELAYED_WORK(&nl->deferred, plip_kick_bh); |
| 311 | 312 | ||
| 312 | if (dev->irq == -1) | 313 | if (dev->irq == -1) |
| 313 | INIT_WORK(&nl->timer, (void (*)(void *))plip_timer_bh, dev); | 314 | INIT_DELAYED_WORK(&nl->timer, plip_timer_bh); |
| 314 | 315 | ||
| 315 | spin_lock_init(&nl->lock); | 316 | spin_lock_init(&nl->lock); |
| 316 | } | 317 | } |
| @@ -319,9 +320,10 @@ plip_init_netdev(struct net_device *dev) | |||
| 319 | This routine is kicked by do_timer(). | 320 | This routine is kicked by do_timer(). |
| 320 | Request `plip_bh' to be invoked. */ | 321 | Request `plip_bh' to be invoked. */ |
| 321 | static void | 322 | static void |
| 322 | plip_kick_bh(struct net_device *dev) | 323 | plip_kick_bh(struct work_struct *work) |
| 323 | { | 324 | { |
| 324 | struct net_local *nl = netdev_priv(dev); | 325 | struct net_local *nl = |
| 326 | container_of(work, struct net_local, deferred.work); | ||
| 325 | 327 | ||
| 326 | if (nl->is_deferred) | 328 | if (nl->is_deferred) |
| 327 | schedule_work(&nl->immediate); | 329 | schedule_work(&nl->immediate); |
| @@ -362,9 +364,9 @@ static const plip_func connection_state_table[] = | |||
| 362 | 364 | ||
| 363 | /* Bottom half handler of PLIP. */ | 365 | /* Bottom half handler of PLIP. */ |
| 364 | static void | 366 | static void |
| 365 | plip_bh(struct net_device *dev) | 367 | plip_bh(struct work_struct *work) |
| 366 | { | 368 | { |
| 367 | struct net_local *nl = netdev_priv(dev); | 369 | struct net_local *nl = container_of(work, struct net_local, immediate); |
| 368 | struct plip_local *snd = &nl->snd_data; | 370 | struct plip_local *snd = &nl->snd_data; |
| 369 | struct plip_local *rcv = &nl->rcv_data; | 371 | struct plip_local *rcv = &nl->rcv_data; |
| 370 | plip_func f; | 372 | plip_func f; |
| @@ -372,20 +374,21 @@ plip_bh(struct net_device *dev) | |||
| 372 | 374 | ||
| 373 | nl->is_deferred = 0; | 375 | nl->is_deferred = 0; |
| 374 | f = connection_state_table[nl->connection]; | 376 | f = connection_state_table[nl->connection]; |
| 375 | if ((r = (*f)(dev, nl, snd, rcv)) != OK | 377 | if ((r = (*f)(nl->dev, nl, snd, rcv)) != OK |
| 376 | && (r = plip_bh_timeout_error(dev, nl, snd, rcv, r)) != OK) { | 378 | && (r = plip_bh_timeout_error(nl->dev, nl, snd, rcv, r)) != OK) { |
| 377 | nl->is_deferred = 1; | 379 | nl->is_deferred = 1; |
| 378 | schedule_delayed_work(&nl->deferred, 1); | 380 | schedule_delayed_work(&nl->deferred, 1); |
| 379 | } | 381 | } |
| 380 | } | 382 | } |
| 381 | 383 | ||
| 382 | static void | 384 | static void |
| 383 | plip_timer_bh(struct net_device *dev) | 385 | plip_timer_bh(struct work_struct *work) |
| 384 | { | 386 | { |
| 385 | struct net_local *nl = netdev_priv(dev); | 387 | struct net_local *nl = |
| 388 | container_of(work, struct net_local, timer.work); | ||
| 386 | 389 | ||
| 387 | if (!(atomic_read (&nl->kill_timer))) { | 390 | if (!(atomic_read (&nl->kill_timer))) { |
| 388 | plip_interrupt (-1, dev); | 391 | plip_interrupt (-1, nl->dev); |
| 389 | 392 | ||
| 390 | schedule_delayed_work(&nl->timer, 1); | 393 | schedule_delayed_work(&nl->timer, 1); |
| 391 | } | 394 | } |
| @@ -1284,6 +1287,7 @@ static void plip_attach (struct parport *port) | |||
| 1284 | } | 1287 | } |
| 1285 | 1288 | ||
| 1286 | nl = netdev_priv(dev); | 1289 | nl = netdev_priv(dev); |
| 1290 | nl->dev = dev; | ||
| 1287 | nl->pardev = parport_register_device(port, name, plip_preempt, | 1291 | nl->pardev = parport_register_device(port, name, plip_preempt, |
| 1288 | plip_wakeup, plip_interrupt, | 1292 | plip_wakeup, plip_interrupt, |
| 1289 | 0, dev); | 1293 | 0, dev); |
