diff options
author | Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | 2008-01-27 23:34:33 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-31 19:26:59 -0800 |
commit | 039ee17d1baabaa21783a0d5ab3e8c6d8c794bdf (patch) | |
tree | 245fafd78aa16a002b7aa7d539f517172d256338 /drivers/net/usb/rndis_host.c | |
parent | 5d6ecf6c5d4994198527496fa51ea119030400e0 (diff) |
rndis_host: Add RNDIS physical medium checking into generic_rndis_bind()
Add RNDIS physical medium checking into generic_rndis_bind() and also make
rndis_host to be only bind on every medium except wireless.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/rndis_host.c')
-rw-r--r-- | drivers/net/usb/rndis_host.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 800c9d02c3f4..0606e11510ae 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c @@ -271,7 +271,8 @@ response_error: return -EDOM; } -int generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf) +int +generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) { int retval; struct net_device *net = dev->net; @@ -287,7 +288,7 @@ int generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf) struct rndis_set_c *set_c; struct rndis_halt *halt; } u; - u32 tmp; + u32 tmp, *phym; int reply_len; unsigned char *bp; @@ -358,6 +359,30 @@ int generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf) dev->driver_info->early_init(dev) != 0) goto halt_fail_and_release; + /* Check physical medium */ + reply_len = sizeof *phym; + retval = rndis_query(dev, intf, u.buf, OID_GEN_PHYSICAL_MEDIUM, + 0, (void **) &phym, &reply_len); + if (retval != 0) + /* OID is optional so don't fail here. */ + *phym = RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED; + if ((flags & FLAG_RNDIS_PHYM_WIRELESS) && + *phym != RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) { + if (netif_msg_probe(dev)) + dev_dbg(&intf->dev, "driver requires wireless " + "physical medium, but device is not.\n"); + retval = -ENODEV; + goto halt_fail_and_release; + } + if ((flags & FLAG_RNDIS_PHYM_NOT_WIRELESS) && + *phym == RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) { + if (netif_msg_probe(dev)) + dev_dbg(&intf->dev, "driver requires non-wireless " + "physical medium, but device is wireless.\n"); + retval = -ENODEV; + goto halt_fail_and_release; + } + /* Get designated host ethernet address */ reply_len = ETH_ALEN; retval = rndis_query(dev, intf, u.buf, OID_802_3_PERMANENT_ADDRESS, @@ -403,6 +428,11 @@ fail: } EXPORT_SYMBOL_GPL(generic_rndis_bind); +static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) +{ + return generic_rndis_bind(dev, intf, FLAG_RNDIS_PHYM_NOT_WIRELESS); +} + void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) { struct rndis_halt *halt; @@ -518,7 +548,7 @@ EXPORT_SYMBOL_GPL(rndis_tx_fixup); static const struct driver_info rndis_info = { .description = "RNDIS device", .flags = FLAG_ETHER | FLAG_FRAMING_RN | FLAG_NO_SETINT, - .bind = generic_rndis_bind, + .bind = rndis_bind, .unbind = rndis_unbind, .status = rndis_status, .rx_fixup = rndis_rx_fixup, |