diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/eth_media.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 0f312c261bed..2132c1ef2951 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
@@ -46,12 +46,14 @@ | |||
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 | ||
@@ -143,6 +145,17 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev, | |||
143 | } | 145 | } |
144 | 146 | ||
145 | /** | 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 | /** | ||
146 | * enable_bearer - attach TIPC bearer to an Ethernet interface | 159 | * enable_bearer - attach TIPC bearer to an Ethernet interface |
147 | */ | 160 | */ |
148 | static int enable_bearer(struct tipc_bearer *tb_ptr) | 161 | static int enable_bearer(struct tipc_bearer *tb_ptr) |
@@ -182,7 +195,8 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) | |||
182 | eb_ptr->tipc_packet_type.func = recv_msg; | 195 | eb_ptr->tipc_packet_type.func = recv_msg; |
183 | eb_ptr->tipc_packet_type.af_packet_priv = eb_ptr; | 196 | eb_ptr->tipc_packet_type.af_packet_priv = eb_ptr; |
184 | INIT_LIST_HEAD(&(eb_ptr->tipc_packet_type.list)); | 197 | INIT_LIST_HEAD(&(eb_ptr->tipc_packet_type.list)); |
185 | dev_add_pack(&eb_ptr->tipc_packet_type); | 198 | INIT_WORK(&eb_ptr->setup, setup_bearer); |
199 | schedule_work(&eb_ptr->setup); | ||
186 | 200 | ||
187 | /* Associate TIPC bearer with Ethernet bearer */ | 201 | /* Associate TIPC bearer with Ethernet bearer */ |
188 | eb_ptr->bearer = tb_ptr; | 202 | eb_ptr->bearer = tb_ptr; |