diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-08-31 17:08:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-11 15:54:55 -0400 |
commit | 384912ed194e43c03ad1cdaa09b0b1e488c34d46 (patch) | |
tree | bdaae15252819543cff0900941238d2b99bb2300 /drivers | |
parent | f510c35de0e63e1066db83d2fdce99e6dbde0c80 (diff) |
net: Add DEVTYPE support for Ethernet based devices
The Ethernet framing is used for a lot of devices these days. Most
prominent are WiFi and WiMAX based devices. However for userspace
application it is important to classify these devices correctly and
not only see them as Ethernet devices. The daemons like HAL, DeviceKit
or even NetworkManager with udev support tries to do the classification
in userspace with a lot trickery and extra system calls. This is not
good and actually reaches its limitations. Especially since the kernel
does know the type of the Ethernet device it is pretty stupid.
To solve this problem the underlying device type needs to be set and
then the value will be exported as DEVTYPE via uevents and available
within udev.
# cat /sys/class/net/wlan0/uevent
DEVTYPE=wlan
INTERFACE=wlan0
IFINDEX=5
This is similar to subsystems like USB and SCSI that distinguish
between hosts, devices, disks, partitions etc.
The new SET_NETDEV_DEVTYPE() is a convenience helper to set the actual
device type. All device types are free form, but for convenience the
same strings as used with RFKILL are choosen.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/usb/hso.c | 5 | ||||
-rw-r--r-- | drivers/net/wimax/i2400m/sdio.c | 5 | ||||
-rw-r--r-- | drivers/net/wimax/i2400m/usb.c | 5 |
3 files changed, 15 insertions, 0 deletions
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 3f9c92a2afcb..fa4e58196c21 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -2535,6 +2535,10 @@ static void hso_create_rfkill(struct hso_device *hso_dev, | |||
2535 | } | 2535 | } |
2536 | } | 2536 | } |
2537 | 2537 | ||
2538 | static struct device_type hso_type = { | ||
2539 | .name = "wwan", | ||
2540 | }; | ||
2541 | |||
2538 | /* Creates our network device */ | 2542 | /* Creates our network device */ |
2539 | static struct hso_device *hso_create_net_device(struct usb_interface *interface, | 2543 | static struct hso_device *hso_create_net_device(struct usb_interface *interface, |
2540 | int port_spec) | 2544 | int port_spec) |
@@ -2575,6 +2579,7 @@ static struct hso_device *hso_create_net_device(struct usb_interface *interface, | |||
2575 | goto exit; | 2579 | goto exit; |
2576 | } | 2580 | } |
2577 | SET_NETDEV_DEV(net, &interface->dev); | 2581 | SET_NETDEV_DEV(net, &interface->dev); |
2582 | SET_NETDEV_DEVTYPE(net, &hso_type); | ||
2578 | 2583 | ||
2579 | /* registering our net device */ | 2584 | /* registering our net device */ |
2580 | result = register_netdev(net); | 2585 | result = register_netdev(net); |
diff --git a/drivers/net/wimax/i2400m/sdio.c b/drivers/net/wimax/i2400m/sdio.c index ea7b29034aab..2981e211e04f 100644 --- a/drivers/net/wimax/i2400m/sdio.c +++ b/drivers/net/wimax/i2400m/sdio.c | |||
@@ -371,6 +371,10 @@ error: | |||
371 | } | 371 | } |
372 | 372 | ||
373 | 373 | ||
374 | static struct device_type i2400ms_type = { | ||
375 | .name = "wimax", | ||
376 | }; | ||
377 | |||
374 | /* | 378 | /* |
375 | * Probe a i2400m interface and register it | 379 | * Probe a i2400m interface and register it |
376 | * | 380 | * |
@@ -412,6 +416,7 @@ int i2400ms_probe(struct sdio_func *func, | |||
412 | goto error_alloc_netdev; | 416 | goto error_alloc_netdev; |
413 | } | 417 | } |
414 | SET_NETDEV_DEV(net_dev, dev); | 418 | SET_NETDEV_DEV(net_dev, dev); |
419 | SET_NETDEV_DEVTYPE(net_dev, &i2400ms_type); | ||
415 | i2400m = net_dev_to_i2400m(net_dev); | 420 | i2400m = net_dev_to_i2400m(net_dev); |
416 | i2400ms = container_of(i2400m, struct i2400ms, i2400m); | 421 | i2400ms = container_of(i2400m, struct i2400ms, i2400m); |
417 | i2400m->wimax_dev.net_dev = net_dev; | 422 | i2400m->wimax_dev.net_dev = net_dev; |
diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c index cfdaf69da9d1..7eadd11c815b 100644 --- a/drivers/net/wimax/i2400m/usb.c +++ b/drivers/net/wimax/i2400m/usb.c | |||
@@ -351,6 +351,10 @@ error: | |||
351 | } | 351 | } |
352 | 352 | ||
353 | 353 | ||
354 | static struct device_type i2400mu_type = { | ||
355 | .name = "wimax", | ||
356 | }; | ||
357 | |||
354 | /* | 358 | /* |
355 | * Probe a i2400m interface and register it | 359 | * Probe a i2400m interface and register it |
356 | * | 360 | * |
@@ -388,6 +392,7 @@ int i2400mu_probe(struct usb_interface *iface, | |||
388 | goto error_alloc_netdev; | 392 | goto error_alloc_netdev; |
389 | } | 393 | } |
390 | SET_NETDEV_DEV(net_dev, dev); | 394 | SET_NETDEV_DEV(net_dev, dev); |
395 | SET_NETDEV_DEVTYPE(net_dev, &i2400mu_type); | ||
391 | i2400m = net_dev_to_i2400m(net_dev); | 396 | i2400m = net_dev_to_i2400m(net_dev); |
392 | i2400mu = container_of(i2400m, struct i2400mu, i2400m); | 397 | i2400mu = container_of(i2400m, struct i2400mu, i2400m); |
393 | i2400m->wimax_dev.net_dev = net_dev; | 398 | i2400m->wimax_dev.net_dev = net_dev; |