diff options
Diffstat (limited to 'net/tipc/eth_media.c')
-rw-r--r-- | net/tipc/eth_media.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 90ac9bfa7abb..2132c1ef2951 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
@@ -46,19 +46,30 @@ | |||
46 | * @bearer: ptr to associated "generic" bearer structure | 46 | * @bearer: ptr to associated "generic" bearer structure |
47 | * @dev: ptr to associated Ethernet network device | 47 | * @dev: ptr to associated Ethernet network device |
48 | * @tipc_packet_type: used in binding TIPC to Ethernet driver | 48 | * @tipc_packet_type: used in binding TIPC to Ethernet driver |
49 | * @setup: work item used when enabling bearer | ||
49 | * @cleanup: work item used when disabling bearer | 50 | * @cleanup: work item used when disabling bearer |
50 | */ | 51 | */ |
51 | struct eth_bearer { | 52 | struct eth_bearer { |
52 | struct tipc_bearer *bearer; | 53 | struct tipc_bearer *bearer; |
53 | struct net_device *dev; | 54 | struct net_device *dev; |
54 | struct packet_type tipc_packet_type; | 55 | struct packet_type tipc_packet_type; |
56 | struct work_struct setup; | ||
55 | struct work_struct cleanup; | 57 | struct work_struct cleanup; |
56 | }; | 58 | }; |
57 | 59 | ||
58 | static struct tipc_media eth_media_info; | 60 | static struct tipc_media eth_media_info; |
59 | static struct eth_bearer eth_bearers[MAX_ETH_BEARERS]; | 61 | static struct eth_bearer eth_bearers[MAX_ETH_BEARERS]; |
60 | static int eth_started; | 62 | static int eth_started; |
61 | static struct notifier_block notifier; | 63 | |
64 | static int recv_notification(struct notifier_block *nb, unsigned long evt, | ||
65 | void *dv); | ||
66 | /* | ||
67 | * Network device notifier info | ||
68 | */ | ||
69 | static struct notifier_block notifier = { | ||
70 | .notifier_call = recv_notification, | ||
71 | .priority = 0 | ||
72 | }; | ||
62 | 73 | ||
63 | /** | 74 | /** |
64 | * eth_media_addr_set - initialize Ethernet media address structure | 75 | * eth_media_addr_set - initialize Ethernet media address structure |
@@ -134,6 +145,17 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev, | |||
134 | } | 145 | } |
135 | 146 | ||
136 | /** | 147 | /** |
148 | * setup_bearer - setup association between Ethernet bearer and interface | ||
149 | */ | ||
150 | static void setup_bearer(struct work_struct *work) | ||
151 | { | ||
152 | struct eth_bearer *eb_ptr = | ||
153 | container_of(work, struct eth_bearer, setup); | ||
154 | |||
155 | dev_add_pack(&eb_ptr->tipc_packet_type); | ||
156 | } | ||
157 | |||
158 | /** | ||
137 | * enable_bearer - attach TIPC bearer to an Ethernet interface | 159 | * enable_bearer - attach TIPC bearer to an Ethernet interface |
138 | */ | 160 | */ |
139 | static int enable_bearer(struct tipc_bearer *tb_ptr) | 161 | static int enable_bearer(struct tipc_bearer *tb_ptr) |
@@ -173,7 +195,8 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) | |||
173 | eb_ptr->tipc_packet_type.func = recv_msg; | 195 | eb_ptr->tipc_packet_type.func = recv_msg; |
174 | eb_ptr->tipc_packet_type.af_packet_priv = eb_ptr; | 196 | eb_ptr->tipc_packet_type.af_packet_priv = eb_ptr; |
175 | INIT_LIST_HEAD(&(eb_ptr->tipc_packet_type.list)); | 197 | INIT_LIST_HEAD(&(eb_ptr->tipc_packet_type.list)); |
176 | dev_add_pack(&eb_ptr->tipc_packet_type); | 198 | INIT_WORK(&eb_ptr->setup, setup_bearer); |
199 | schedule_work(&eb_ptr->setup); | ||
177 | 200 | ||
178 | /* Associate TIPC bearer with Ethernet bearer */ | 201 | /* Associate TIPC bearer with Ethernet bearer */ |
179 | eb_ptr->bearer = tb_ptr; | 202 | eb_ptr->bearer = tb_ptr; |
@@ -357,8 +380,6 @@ int tipc_eth_media_start(void) | |||
357 | if (res) | 380 | if (res) |
358 | return res; | 381 | return res; |
359 | 382 | ||
360 | notifier.notifier_call = &recv_notification; | ||
361 | notifier.priority = 0; | ||
362 | res = register_netdevice_notifier(¬ifier); | 383 | res = register_netdevice_notifier(¬ifier); |
363 | if (!res) | 384 | if (!res) |
364 | eth_started = 1; | 385 | eth_started = 1; |