static int __devinit ieee802154fake_probe(struct platform_device *pdev) { struct net_device *dev; struct fakehard_priv *priv; struct wpan_phy *phy = wpan_phy_alloc(0); int err; if (!phy) return -ENOMEM; dev = alloc_netdev(sizeof(struct fakehard_priv), "hardwpan%d", ieee802154_fake_setup); if (!dev) { wpan_phy_free(phy); return -ENOMEM; } phy->dev.platform_data = dev; memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef", dev->addr_len); memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); /* * For now we'd like to emulate 2.4 GHz-only device, * both O-QPSK and CSS */ /* 2.4 GHz O-QPSK 802.15.4-2003 */ phy->channels_supported[0] |= 0x7FFF800; /* 2.4 GHz CSS 802.15.4a-2007 */ phy->channels_supported[3] |= 0x3fff; phy->transmit_power = 0xbf; dev->netdev_ops = &fake_ops; dev->ml_priv = &fake_mlme; priv = netdev_priv(dev); priv->phy = phy; wpan_phy_set_dev(phy, &pdev->dev); SET_NETDEV_DEV(dev, &phy->dev); platform_set_drvdata(pdev, dev); err = wpan_phy_register(phy); if (err) goto out; err = register_netdev(dev); if (err < 0) goto out; dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n"); return 0; out: unregister_netdev(dev); return err; }
int ieee802154_register_hw(struct ieee802154_hw *hw) { struct ieee802154_local *local = hw_to_local(hw); struct net_device *dev; int rc = -ENOSYS; local->workqueue = create_singlethread_workqueue(wpan_phy_name(local->phy)); if (!local->workqueue) { rc = -ENOMEM; goto out; } hrtimer_init(&local->ifs_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); local->ifs_timer.function = ieee802154_xmit_ifs_timer; wpan_phy_set_dev(local->phy, local->hw.parent); ieee802154_setup_wpan_phy_pib(local->phy); if (!(hw->flags & IEEE802154_HW_CSMA_PARAMS)) { local->phy->supported.min_csma_backoffs = 4; local->phy->supported.max_csma_backoffs = 4; local->phy->supported.min_maxbe = 5; local->phy->supported.max_maxbe = 5; local->phy->supported.min_minbe = 3; local->phy->supported.max_minbe = 3; } if (!(hw->flags & IEEE802154_HW_FRAME_RETRIES)) { /* TODO should be 3, but our default value is -1 which means * no ARET handling. */ local->phy->supported.min_frame_retries = -1; local->phy->supported.max_frame_retries = -1; } if (hw->flags & IEEE802154_HW_PROMISCUOUS) local->phy->supported.iftypes |= BIT(NL802154_IFTYPE_MONITOR); rc = wpan_phy_register(local->phy); if (rc < 0) goto out_wq; rtnl_lock(); dev = ieee802154_if_add(local, "wpan%d", NET_NAME_ENUM, NL802154_IFTYPE_NODE, cpu_to_le64(0x0000000000000000ULL)); if (IS_ERR(dev)) { rtnl_unlock(); rc = PTR_ERR(dev); goto out_phy; } rtnl_unlock(); return 0; out_phy: wpan_phy_unregister(local->phy); out_wq: destroy_workqueue(local->workqueue); out: return rc; }
static int ieee802154xbee_probe(struct platform_device *pdev) { struct net_device *dev; struct xbee_priv *priv; struct wpan_phy *phy = wpan_phy_alloc(0); int err; if (!phy) return -ENOMEM; dev = alloc_netdev(sizeof(struct xbee_priv), "hardwpan%d", ieee802154_xbee_setup); if (!dev) { wpan_phy_free(phy); return -ENOMEM; } memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef", dev->addr_len); /* * For now we'd like to emulate 2.4 GHz-only device, * both O-QPSK and CSS */ /* 2.4 GHz O-QPSK 802.15.4-2003 */ phy->channels_supported[0] |= 0x7FFF800; /* 2.4 GHz CSS 802.15.4a-2007 */ phy->channels_supported[3] |= 0x3fff; phy->transmit_power = 0xbf; dev->netdev_ops = &xbee_ops; dev->ml_priv = &xbee_mlme; priv = netdev_priv(dev); priv->phy = phy; wpan_phy_set_dev(phy, &pdev->dev); SET_NETDEV_DEV(dev, &phy->dev); platform_set_drvdata(pdev, dev); priv->rbuff = kmalloc(XBEE_MAXFRAME, GFP_KERNEL); priv->rcount = 0; priv->frame_status = UNFRAMED; priv->frame_len = 0; priv->escaped = 0; xbee_dev = dev; // This should be removed in a future! err = wpan_phy_register(phy); if (err) goto out; err = register_netdev(dev); if (err < 0) goto out; dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n"); return 0; out: unregister_netdev(dev); return err; }