diff options
Diffstat (limited to 'drivers/ieee802154/fakehard.c')
-rw-r--r-- | drivers/ieee802154/fakehard.c | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/drivers/ieee802154/fakehard.c b/drivers/ieee802154/fakehard.c index 262536fae905..22a93bc764c5 100644 --- a/drivers/ieee802154/fakehard.c +++ b/drivers/ieee802154/fakehard.c | |||
@@ -30,6 +30,12 @@ | |||
30 | #include <net/ieee802154_netdev.h> | 30 | #include <net/ieee802154_netdev.h> |
31 | #include <net/ieee802154.h> | 31 | #include <net/ieee802154.h> |
32 | #include <net/nl802154.h> | 32 | #include <net/nl802154.h> |
33 | #include <net/wpan-phy.h> | ||
34 | |||
35 | struct wpan_phy *net_to_phy(struct net_device *dev) | ||
36 | { | ||
37 | return container_of(dev->dev.parent, struct wpan_phy, dev); | ||
38 | } | ||
33 | 39 | ||
34 | /** | 40 | /** |
35 | * fake_get_pan_id - Retrieve the PAN ID of the device. | 41 | * fake_get_pan_id - Retrieve the PAN ID of the device. |
@@ -115,6 +121,12 @@ static u8 fake_get_bsn(struct net_device *dev) | |||
115 | static int fake_assoc_req(struct net_device *dev, | 121 | static int fake_assoc_req(struct net_device *dev, |
116 | struct ieee802154_addr *addr, u8 channel, u8 cap) | 122 | struct ieee802154_addr *addr, u8 channel, u8 cap) |
117 | { | 123 | { |
124 | struct wpan_phy *phy = net_to_phy(dev); | ||
125 | |||
126 | mutex_lock(&phy->pib_lock); | ||
127 | phy->current_channel = channel; | ||
128 | mutex_unlock(&phy->pib_lock); | ||
129 | |||
118 | /* We simply emulate it here */ | 130 | /* We simply emulate it here */ |
119 | return ieee802154_nl_assoc_confirm(dev, fake_get_short_addr(dev), | 131 | return ieee802154_nl_assoc_confirm(dev, fake_get_short_addr(dev), |
120 | IEEE802154_SUCCESS); | 132 | IEEE802154_SUCCESS); |
@@ -183,6 +195,12 @@ static int fake_start_req(struct net_device *dev, struct ieee802154_addr *addr, | |||
183 | u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, | 195 | u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx, |
184 | u8 coord_realign) | 196 | u8 coord_realign) |
185 | { | 197 | { |
198 | struct wpan_phy *phy = net_to_phy(dev); | ||
199 | |||
200 | mutex_lock(&phy->pib_lock); | ||
201 | phy->current_channel = channel; | ||
202 | mutex_unlock(&phy->pib_lock); | ||
203 | |||
186 | /* We don't emulate beacons here at all, so START should fail */ | 204 | /* We don't emulate beacons here at all, so START should fail */ |
187 | ieee802154_nl_start_confirm(dev, IEEE802154_INVALID_PARAMETER); | 205 | ieee802154_nl_start_confirm(dev, IEEE802154_INVALID_PARAMETER); |
188 | return 0; | 206 | return 0; |
@@ -290,6 +308,14 @@ static const struct net_device_ops fake_ops = { | |||
290 | .ndo_set_mac_address = ieee802154_fake_mac_addr, | 308 | .ndo_set_mac_address = ieee802154_fake_mac_addr, |
291 | }; | 309 | }; |
292 | 310 | ||
311 | static void ieee802154_fake_destruct(struct net_device *dev) | ||
312 | { | ||
313 | struct wpan_phy *phy = net_to_phy(dev); | ||
314 | |||
315 | wpan_phy_unregister(phy); | ||
316 | free_netdev(dev); | ||
317 | wpan_phy_free(phy); | ||
318 | } | ||
293 | 319 | ||
294 | static void ieee802154_fake_setup(struct net_device *dev) | 320 | static void ieee802154_fake_setup(struct net_device *dev) |
295 | { | 321 | { |
@@ -302,22 +328,34 @@ static void ieee802154_fake_setup(struct net_device *dev) | |||
302 | dev->type = ARPHRD_IEEE802154; | 328 | dev->type = ARPHRD_IEEE802154; |
303 | dev->flags = IFF_NOARP | IFF_BROADCAST; | 329 | dev->flags = IFF_NOARP | IFF_BROADCAST; |
304 | dev->watchdog_timeo = 0; | 330 | dev->watchdog_timeo = 0; |
331 | dev->destructor = ieee802154_fake_destruct; | ||
305 | } | 332 | } |
306 | 333 | ||
307 | 334 | ||
308 | static int __devinit ieee802154fake_probe(struct platform_device *pdev) | 335 | static int __devinit ieee802154fake_probe(struct platform_device *pdev) |
309 | { | 336 | { |
310 | struct net_device *dev = | 337 | struct net_device *dev; |
311 | alloc_netdev(0, "hardwpan%d", ieee802154_fake_setup); | 338 | struct wpan_phy *phy = wpan_phy_alloc(0); |
312 | int err; | 339 | int err; |
313 | 340 | ||
314 | if (!dev) | 341 | if (!phy) |
342 | return -ENOMEM; | ||
343 | |||
344 | dev = alloc_netdev(0, "hardwpan%d", ieee802154_fake_setup); | ||
345 | if (!dev) { | ||
346 | wpan_phy_free(phy); | ||
315 | return -ENOMEM; | 347 | return -ENOMEM; |
348 | } | ||
349 | |||
350 | phy->dev.platform_data = dev; | ||
316 | 351 | ||
317 | memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef", | 352 | memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef", |
318 | dev->addr_len); | 353 | dev->addr_len); |
319 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | 354 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); |
320 | 355 | ||
356 | phy->channels_supported = (1 << 27) - 1; | ||
357 | phy->transmit_power = 0xbf; | ||
358 | |||
321 | dev->netdev_ops = &fake_ops; | 359 | dev->netdev_ops = &fake_ops; |
322 | dev->ml_priv = &fake_mlme; | 360 | dev->ml_priv = &fake_mlme; |
323 | 361 | ||
@@ -331,15 +369,18 @@ static int __devinit ieee802154fake_probe(struct platform_device *pdev) | |||
331 | goto out; | 369 | goto out; |
332 | } | 370 | } |
333 | 371 | ||
334 | SET_NETDEV_DEV(dev, &pdev->dev); | 372 | SET_NETDEV_DEV(dev, &phy->dev); |
335 | 373 | ||
336 | platform_set_drvdata(pdev, dev); | 374 | platform_set_drvdata(pdev, dev); |
337 | 375 | ||
376 | err = wpan_phy_register(&pdev->dev, phy); | ||
377 | if (err) | ||
378 | goto out; | ||
379 | |||
338 | err = register_netdev(dev); | 380 | err = register_netdev(dev); |
339 | if (err < 0) | 381 | if (err < 0) |
340 | goto out; | 382 | goto out; |
341 | 383 | ||
342 | |||
343 | dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n"); | 384 | dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n"); |
344 | return 0; | 385 | return 0; |
345 | 386 | ||
@@ -352,7 +393,6 @@ static int __devexit ieee802154fake_remove(struct platform_device *pdev) | |||
352 | { | 393 | { |
353 | struct net_device *dev = platform_get_drvdata(pdev); | 394 | struct net_device *dev = platform_get_drvdata(pdev); |
354 | unregister_netdev(dev); | 395 | unregister_netdev(dev); |
355 | free_netdev(dev); | ||
356 | return 0; | 396 | return 0; |
357 | } | 397 | } |
358 | 398 | ||