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; |
