aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/atm/mpc.c32
-rw-r--r--net/atm/mpc.h5
2 files changed, 18 insertions, 19 deletions
diff --git a/net/atm/mpc.c b/net/atm/mpc.c
index 039d5cc72c3d..e5bf11453a18 100644
--- a/net/atm/mpc.c
+++ b/net/atm/mpc.c
@@ -286,33 +286,32 @@ static void start_mpc(struct mpoa_client *mpc, struct net_device *dev)
286{ 286{
287 287
288 dprintk("mpoa: (%s) start_mpc:\n", mpc->dev->name); 288 dprintk("mpoa: (%s) start_mpc:\n", mpc->dev->name);
289 if (dev->hard_start_xmit == NULL) { 289 if (!dev->netdev_ops)
290 printk("mpoa: (%s) start_mpc: dev->hard_start_xmit == NULL, not starting\n", 290 printk("mpoa: (%s) start_mpc not starting\n", dev->name);
291 dev->name); 291 else {
292 return; 292 mpc->old_ops = dev->netdev_ops;
293 mpc->new_ops = *mpc->old_ops;
294 mpc->new_ops.ndo_start_xmit = mpc_send_packet;
295 dev->netdev_ops = &mpc->new_ops;
293 } 296 }
294 mpc->old_hard_start_xmit = dev->hard_start_xmit;
295 dev->hard_start_xmit = mpc_send_packet;
296
297 return;
298} 297}
299 298
300static void stop_mpc(struct mpoa_client *mpc) 299static void stop_mpc(struct mpoa_client *mpc)
301{ 300{
302 301 struct net_device *dev = mpc->dev;
303 dprintk("mpoa: (%s) stop_mpc:", mpc->dev->name); 302 dprintk("mpoa: (%s) stop_mpc:", mpc->dev->name);
304 303
305 /* Lets not nullify lec device's dev->hard_start_xmit */ 304 /* Lets not nullify lec device's dev->hard_start_xmit */
306 if (mpc->dev->hard_start_xmit != mpc_send_packet) { 305 if (dev->netdev_ops != &mpc->new_ops) {
307 dprintk(" mpc already stopped, not fatal\n"); 306 dprintk(" mpc already stopped, not fatal\n");
308 return; 307 return;
309 } 308 }
310 dprintk("\n"); 309 dprintk("\n");
311 mpc->dev->hard_start_xmit = mpc->old_hard_start_xmit;
312 mpc->old_hard_start_xmit = NULL;
313 /* close_shortcuts(mpc); ??? FIXME */
314 310
315 return; 311 dev->netdev_ops = mpc->old_ops;
312 mpc->old_ops = NULL;
313
314 /* close_shortcuts(mpc); ??? FIXME */
316} 315}
317 316
318static const char *mpoa_device_type_string(char type) __attribute__ ((unused)); 317static const char *mpoa_device_type_string(char type) __attribute__ ((unused));
@@ -531,7 +530,6 @@ static int send_via_shortcut(struct sk_buff *skb, struct mpoa_client *mpc)
531 */ 530 */
532static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev) 531static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev)
533{ 532{
534 int retval;
535 struct mpoa_client *mpc; 533 struct mpoa_client *mpc;
536 struct ethhdr *eth; 534 struct ethhdr *eth;
537 int i = 0; 535 int i = 0;
@@ -561,9 +559,7 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev)
561 } 559 }
562 560
563 non_ip: 561 non_ip:
564 retval = mpc->old_hard_start_xmit(skb,dev); 562 return mpc->old_ops->ndo_start_xmit(skb,dev);
565
566 return retval;
567} 563}
568 564
569static int atm_mpoa_vcc_attach(struct atm_vcc *vcc, void __user *arg) 565static int atm_mpoa_vcc_attach(struct atm_vcc *vcc, void __user *arg)
diff --git a/net/atm/mpc.h b/net/atm/mpc.h
index 24c386c35f57..0919a88bbc70 100644
--- a/net/atm/mpc.h
+++ b/net/atm/mpc.h
@@ -15,7 +15,7 @@ struct mpoa_client {
15 struct mpoa_client *next; 15 struct mpoa_client *next;
16 struct net_device *dev; /* lec in question */ 16 struct net_device *dev; /* lec in question */
17 int dev_num; /* e.g. 2 for lec2 */ 17 int dev_num; /* e.g. 2 for lec2 */
18 int (*old_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); 18
19 struct atm_vcc *mpoad_vcc; /* control channel to mpoad */ 19 struct atm_vcc *mpoad_vcc; /* control channel to mpoad */
20 uint8_t mps_ctrl_addr[ATM_ESA_LEN]; /* MPS control ATM address */ 20 uint8_t mps_ctrl_addr[ATM_ESA_LEN]; /* MPS control ATM address */
21 uint8_t our_ctrl_addr[ATM_ESA_LEN]; /* MPC's control ATM address */ 21 uint8_t our_ctrl_addr[ATM_ESA_LEN]; /* MPC's control ATM address */
@@ -31,6 +31,9 @@ struct mpoa_client {
31 uint8_t *mps_macs; /* array of MPS MAC addresses, >=1 */ 31 uint8_t *mps_macs; /* array of MPS MAC addresses, >=1 */
32 int number_of_mps_macs; /* number of the above MAC addresses */ 32 int number_of_mps_macs; /* number of the above MAC addresses */
33 struct mpc_parameters parameters; /* parameters for this client */ 33 struct mpc_parameters parameters; /* parameters for this client */
34
35 const struct net_device_ops *old_ops;
36 struct net_device_ops new_ops;
34}; 37};
35 38
36 39