aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2014-10-25 11:16:33 -0400
committerMarcel Holtmann <marcel@holtmann.org>2014-10-25 15:55:37 -0400
commit36426484fcaca2153616d6f3496b389a5b11bd9f (patch)
treec1ed9792a674af1c7d373f4580373f91edceb4f0
parent580947d395c3827af805573c5fafa87dc01b13bb (diff)
ieee802154: remove fakehard driver
This patch removes the not functional fakehard driver. We don't support HardMAC 802.15.4 drivers right now. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--drivers/net/ieee802154/Kconfig10
-rw-r--r--drivers/net/ieee802154/Makefile1
-rw-r--r--drivers/net/ieee802154/fakehard.c427
3 files changed, 0 insertions, 438 deletions
diff --git a/drivers/net/ieee802154/Kconfig b/drivers/net/ieee802154/Kconfig
index 391a916622a9..1a3c3e57aa0b 100644
--- a/drivers/net/ieee802154/Kconfig
+++ b/drivers/net/ieee802154/Kconfig
@@ -10,16 +10,6 @@ menuconfig IEEE802154_DRIVERS
10 If you say N, all options in this submenu will be skipped and 10 If you say N, all options in this submenu will be skipped and
11 disabled. 11 disabled.
12 12
13config IEEE802154_FAKEHARD
14 tristate "Fake LR-WPAN driver with several interconnected devices"
15 depends on IEEE802154_DRIVERS
16 ---help---
17 Say Y here to enable the fake driver that serves as an example
18 of HardMAC device driver.
19
20 This driver can also be built as a module. To do so say M here.
21 The module will be called 'fakehard'.
22
23config IEEE802154_FAKELB 13config IEEE802154_FAKELB
24 depends on IEEE802154_DRIVERS && MAC802154 14 depends on IEEE802154_DRIVERS && MAC802154
25 tristate "IEEE 802.15.4 loopback driver" 15 tristate "IEEE 802.15.4 loopback driver"
diff --git a/drivers/net/ieee802154/Makefile b/drivers/net/ieee802154/Makefile
index 655cb95e6e24..d77fa4d77e27 100644
--- a/drivers/net/ieee802154/Makefile
+++ b/drivers/net/ieee802154/Makefile
@@ -1,4 +1,3 @@
1obj-$(CONFIG_IEEE802154_FAKEHARD) += fakehard.o
2obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o 1obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o
3obj-$(CONFIG_IEEE802154_AT86RF230) += at86rf230.o 2obj-$(CONFIG_IEEE802154_AT86RF230) += at86rf230.o
4obj-$(CONFIG_IEEE802154_MRF24J40) += mrf24j40.o 3obj-$(CONFIG_IEEE802154_MRF24J40) += mrf24j40.o
diff --git a/drivers/net/ieee802154/fakehard.c b/drivers/net/ieee802154/fakehard.c
deleted file mode 100644
index 8be05ade0ceb..000000000000
--- a/drivers/net/ieee802154/fakehard.c
+++ /dev/null
@@ -1,427 +0,0 @@
1/*
2 * Sample driver for HardMAC IEEE 802.15.4 devices
3 *
4 * Copyright (C) 2009 Siemens AG
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Written by:
20 * Dmitry Eremin-Solenikov <dmitry.baryshkov@siemens.com>
21 */
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/platform_device.h>
25#include <linux/netdevice.h>
26#include <linux/skbuff.h>
27#include <linux/if_arp.h>
28#include <linux/ieee802154.h>
29
30#include <net/af_ieee802154.h>
31#include <net/ieee802154_netdev.h>
32#include <net/nl802154.h>
33#include <net/cfg802154.h>
34
35struct fakehard_priv {
36 struct wpan_phy *phy;
37};
38
39static struct wpan_phy *fake_to_phy(const struct net_device *dev)
40{
41 struct fakehard_priv *priv = netdev_priv(dev);
42 return priv->phy;
43}
44
45/**
46 * fake_get_phy - Return a phy corresponding to this device.
47 * @dev: The network device for which to return the wan-phy object
48 *
49 * This function returns a wpan-phy object corresponding to the passed
50 * network device. Reference counter for wpan-phy object is incremented,
51 * so when the wpan-phy isn't necessary, you should drop the reference
52 * via @wpan_phy_put() call.
53 */
54static struct wpan_phy *fake_get_phy(const struct net_device *dev)
55{
56 struct wpan_phy *phy = fake_to_phy(dev);
57 return to_phy(get_device(&phy->dev));
58}
59
60/**
61 * fake_get_pan_id - Retrieve the PAN ID of the device.
62 * @dev: The network device to retrieve the PAN of.
63 *
64 * Return the ID of the PAN from the PIB.
65 */
66static __le16 fake_get_pan_id(const struct net_device *dev)
67{
68 BUG_ON(dev->type != ARPHRD_IEEE802154);
69
70 return cpu_to_le16(0xeba1);
71}
72
73/**
74 * fake_get_short_addr - Retrieve the short address of the device.
75 * @dev: The network device to retrieve the short address of.
76 *
77 * Returns the IEEE 802.15.4 short-form address cached for this
78 * device. If the device has not yet had a short address assigned
79 * then this should return 0xFFFF to indicate a lack of association.
80 */
81static __le16 fake_get_short_addr(const struct net_device *dev)
82{
83 BUG_ON(dev->type != ARPHRD_IEEE802154);
84
85 return cpu_to_le16(0x1);
86}
87
88/**
89 * fake_get_dsn - Retrieve the DSN of the device.
90 * @dev: The network device to retrieve the DSN for.
91 *
92 * Returns the IEEE 802.15.4 DSN for the network device.
93 * The DSN is the sequence number which will be added to each
94 * packet or MAC command frame by the MAC during transmission.
95 *
96 * DSN means 'Data Sequence Number'.
97 *
98 * Note: This is in section 7.2.1.2 of the IEEE 802.15.4-2006
99 * document.
100 */
101static u8 fake_get_dsn(const struct net_device *dev)
102{
103 BUG_ON(dev->type != ARPHRD_IEEE802154);
104
105 return 0x00; /* DSN are implemented in HW, so return just 0 */
106}
107
108/**
109 * fake_assoc_req - Make an association request to the HW.
110 * @dev: The network device which we are associating to a network.
111 * @addr: The coordinator with which we wish to associate.
112 * @channel: The channel on which to associate.
113 * @cap: The capability information field to use in the association.
114 *
115 * Start an association with a coordinator. The coordinator's address
116 * and PAN ID can be found in @addr.
117 *
118 * Note: This is in section 7.3.1 and 7.5.3.1 of the IEEE
119 * 802.15.4-2006 document.
120 */
121static int fake_assoc_req(struct net_device *dev,
122 struct ieee802154_addr *addr, u8 channel, u8 page, u8 cap)
123{
124 struct wpan_phy *phy = fake_to_phy(dev);
125
126 mutex_lock(&phy->pib_lock);
127 phy->current_channel = channel;
128 phy->current_page = page;
129 mutex_unlock(&phy->pib_lock);
130
131 /* We simply emulate it here */
132 return ieee802154_nl_assoc_confirm(dev, fake_get_short_addr(dev),
133 IEEE802154_SUCCESS);
134}
135
136/**
137 * fake_assoc_resp - Send an association response to a device.
138 * @dev: The network device on which to send the response.
139 * @addr: The address of the device to respond to.
140 * @short_addr: The assigned short address for the device (if any).
141 * @status: The result of the association request.
142 *
143 * Queue the association response of the coordinator to another
144 * device's attempt to associate with the network which we
145 * coordinate. This is then added to the indirect-send queue to be
146 * transmitted to the end device when it polls for data.
147 *
148 * Note: This is in section 7.3.2 and 7.5.3.1 of the IEEE
149 * 802.15.4-2006 document.
150 */
151static int fake_assoc_resp(struct net_device *dev,
152 struct ieee802154_addr *addr, __le16 short_addr, u8 status)
153{
154 return 0;
155}
156
157/**
158 * fake_disassoc_req - Disassociate a device from a network.
159 * @dev: The network device on which we're disassociating a device.
160 * @addr: The device to disassociate from the network.
161 * @reason: The reason to give to the device for being disassociated.
162 *
163 * This sends a disassociation notification to the device being
164 * disassociated from the network.
165 *
166 * Note: This is in section 7.5.3.2 of the IEEE 802.15.4-2006
167 * document, with the reason described in 7.3.3.2.
168 */
169static int fake_disassoc_req(struct net_device *dev,
170 struct ieee802154_addr *addr, u8 reason)
171{
172 return ieee802154_nl_disassoc_confirm(dev, IEEE802154_SUCCESS);
173}
174
175/**
176 * fake_start_req - Start an IEEE 802.15.4 PAN.
177 * @dev: The network device on which to start the PAN.
178 * @addr: The coordinator address to use when starting the PAN.
179 * @channel: The channel on which to start the PAN.
180 * @bcn_ord: Beacon order.
181 * @sf_ord: Superframe order.
182 * @pan_coord: Whether or not we are the PAN coordinator or just
183 * requesting a realignment perhaps?
184 * @blx: Battery Life Extension feature bitfield.
185 * @coord_realign: Something to realign something else.
186 *
187 * If pan_coord is non-zero then this starts a network with the
188 * provided parameters, otherwise it attempts a coordinator
189 * realignment of the stated network instead.
190 *
191 * Note: This is in section 7.5.2.3 of the IEEE 802.15.4-2006
192 * document, with 7.3.8 describing coordinator realignment.
193 */
194static int fake_start_req(struct net_device *dev,
195 struct ieee802154_addr *addr, u8 channel, u8 page,
196 u8 bcn_ord, u8 sf_ord, u8 pan_coord, u8 blx,
197 u8 coord_realign)
198{
199 struct wpan_phy *phy = fake_to_phy(dev);
200
201 mutex_lock(&phy->pib_lock);
202 phy->current_channel = channel;
203 phy->current_page = page;
204 mutex_unlock(&phy->pib_lock);
205
206 /* We don't emulate beacons here at all, so START should fail */
207 ieee802154_nl_start_confirm(dev, IEEE802154_INVALID_PARAMETER);
208 return 0;
209}
210
211/**
212 * fake_scan_req - Start a channel scan.
213 * @dev: The network device on which to perform a channel scan.
214 * @type: The type of scan to perform.
215 * @channels: The channel bitmask to scan.
216 * @duration: How long to spend on each channel.
217 *
218 * This starts either a passive (energy) scan or an active (PAN) scan
219 * on the channels indicated in the @channels bitmask. The duration of
220 * the scan is measured in terms of superframe duration. Specifically,
221 * the scan will spend aBaseSuperFrameDuration * ((2^n) + 1) on each
222 * channel.
223 *
224 * Note: This is in section 7.5.2.1 of the IEEE 802.15.4-2006 document.
225 */
226static int fake_scan_req(struct net_device *dev, u8 type, u32 channels,
227 u8 page, u8 duration)
228{
229 u8 edl[27] = {};
230 return ieee802154_nl_scan_confirm(dev, IEEE802154_SUCCESS, type,
231 channels, page,
232 type == IEEE802154_MAC_SCAN_ED ? edl : NULL);
233}
234
235static struct ieee802154_mlme_ops fake_mlme = {
236 .assoc_req = fake_assoc_req,
237 .assoc_resp = fake_assoc_resp,
238 .disassoc_req = fake_disassoc_req,
239 .start_req = fake_start_req,
240 .scan_req = fake_scan_req,
241
242 .get_phy = fake_get_phy,
243
244 .get_pan_id = fake_get_pan_id,
245 .get_short_addr = fake_get_short_addr,
246 .get_dsn = fake_get_dsn,
247};
248
249static int ieee802154_fake_open(struct net_device *dev)
250{
251 netif_start_queue(dev);
252 return 0;
253}
254
255static int ieee802154_fake_close(struct net_device *dev)
256{
257 netif_stop_queue(dev);
258 return 0;
259}
260
261static netdev_tx_t ieee802154_fake_xmit(struct sk_buff *skb,
262 struct net_device *dev)
263{
264 dev->stats.tx_packets++;
265 dev->stats.tx_bytes += skb->len;
266
267 /* FIXME: do hardware work here ... */
268
269 dev_kfree_skb(skb);
270 return NETDEV_TX_OK;
271}
272
273
274static int ieee802154_fake_ioctl(struct net_device *dev, struct ifreq *ifr,
275 int cmd)
276{
277 struct sockaddr_ieee802154 *sa =
278 (struct sockaddr_ieee802154 *)&ifr->ifr_addr;
279 u16 pan_id, short_addr;
280
281 switch (cmd) {
282 case SIOCGIFADDR:
283 /* FIXME: fixed here, get from device IRL */
284 pan_id = le16_to_cpu(fake_get_pan_id(dev));
285 short_addr = le16_to_cpu(fake_get_short_addr(dev));
286 if (pan_id == IEEE802154_PANID_BROADCAST ||
287 short_addr == IEEE802154_ADDR_BROADCAST)
288 return -EADDRNOTAVAIL;
289
290 sa->family = AF_IEEE802154;
291 sa->addr.addr_type = IEEE802154_ADDR_SHORT;
292 sa->addr.pan_id = pan_id;
293 sa->addr.short_addr = short_addr;
294 return 0;
295 }
296 return -ENOIOCTLCMD;
297}
298
299static int ieee802154_fake_mac_addr(struct net_device *dev, void *p)
300{
301 return -EBUSY; /* HW address is built into the device */
302}
303
304static const struct net_device_ops fake_ops = {
305 .ndo_open = ieee802154_fake_open,
306 .ndo_stop = ieee802154_fake_close,
307 .ndo_start_xmit = ieee802154_fake_xmit,
308 .ndo_do_ioctl = ieee802154_fake_ioctl,
309 .ndo_set_mac_address = ieee802154_fake_mac_addr,
310};
311
312static void ieee802154_fake_destruct(struct net_device *dev)
313{
314 struct wpan_phy *phy = fake_to_phy(dev);
315
316 wpan_phy_unregister(phy);
317 free_netdev(dev);
318 wpan_phy_free(phy);
319}
320
321static void ieee802154_fake_setup(struct net_device *dev)
322{
323 dev->addr_len = IEEE802154_ADDR_LEN;
324 memset(dev->broadcast, 0xff, IEEE802154_ADDR_LEN);
325 dev->features = NETIF_F_HW_CSUM;
326 dev->needed_tailroom = 2; /* FCS */
327 dev->mtu = 127;
328 dev->tx_queue_len = 10;
329 dev->type = ARPHRD_IEEE802154;
330 dev->flags = IFF_NOARP | IFF_BROADCAST;
331 dev->watchdog_timeo = 0;
332 dev->destructor = ieee802154_fake_destruct;
333}
334
335
336static int ieee802154fake_probe(struct platform_device *pdev)
337{
338 struct net_device *dev;
339 struct fakehard_priv *priv;
340 struct wpan_phy *phy = wpan_phy_alloc(0);
341 int err;
342
343 if (!phy)
344 return -ENOMEM;
345
346 dev = alloc_netdev(sizeof(struct fakehard_priv), "hardwpan%d",
347 NET_NAME_UNKNOWN, ieee802154_fake_setup);
348 if (!dev) {
349 wpan_phy_free(phy);
350 return -ENOMEM;
351 }
352
353 memcpy(dev->dev_addr, "\xba\xbe\xca\xfe\xde\xad\xbe\xef",
354 dev->addr_len);
355
356 /*
357 * For now we'd like to emulate 2.4 GHz-only device,
358 * both O-QPSK and CSS
359 */
360 /* 2.4 GHz O-QPSK 802.15.4-2003 */
361 phy->channels_supported[0] |= 0x7FFF800;
362 /* 2.4 GHz CSS 802.15.4a-2007 */
363 phy->channels_supported[3] |= 0x3fff;
364
365 phy->transmit_power = 0xbf;
366
367 dev->netdev_ops = &fake_ops;
368 dev->ml_priv = &fake_mlme;
369
370 priv = netdev_priv(dev);
371 priv->phy = phy;
372
373 wpan_phy_set_dev(phy, &pdev->dev);
374 SET_NETDEV_DEV(dev, &phy->dev);
375
376 platform_set_drvdata(pdev, dev);
377
378 err = wpan_phy_register(phy);
379 if (err)
380 goto out;
381
382 err = register_netdev(dev);
383 if (err < 0)
384 goto out;
385
386 dev_info(&pdev->dev, "Added ieee802154 HardMAC hardware\n");
387 return 0;
388
389out:
390 unregister_netdev(dev);
391 return err;
392}
393
394static int ieee802154fake_remove(struct platform_device *pdev)
395{
396 struct net_device *dev = platform_get_drvdata(pdev);
397 unregister_netdev(dev);
398 return 0;
399}
400
401static struct platform_device *ieee802154fake_dev;
402
403static struct platform_driver ieee802154fake_driver = {
404 .probe = ieee802154fake_probe,
405 .remove = ieee802154fake_remove,
406 .driver = {
407 .name = "ieee802154hardmac",
408 .owner = THIS_MODULE,
409 },
410};
411
412static __init int fake_init(void)
413{
414 ieee802154fake_dev = platform_device_register_simple(
415 "ieee802154hardmac", -1, NULL, 0);
416 return platform_driver_register(&ieee802154fake_driver);
417}
418
419static __exit void fake_exit(void)
420{
421 platform_driver_unregister(&ieee802154fake_driver);
422 platform_device_unregister(ieee802154fake_dev);
423}
424
425module_init(fake_init);
426module_exit(fake_exit);
427MODULE_LICENSE("GPL");