88
88
MODULE_PARM_DESC(workaround_interval,
89
89
"set stall workaround interval in msecs (0=disabled) (default: 0)");
92
/* various RNDIS OID defs */
93
#define OID_GEN_LINK_SPEED cpu_to_le32(0x00010107)
94
#define OID_GEN_RNDIS_CONFIG_PARAMETER cpu_to_le32(0x0001021b)
96
#define OID_GEN_XMIT_OK cpu_to_le32(0x00020101)
97
#define OID_GEN_RCV_OK cpu_to_le32(0x00020102)
98
#define OID_GEN_XMIT_ERROR cpu_to_le32(0x00020103)
99
#define OID_GEN_RCV_ERROR cpu_to_le32(0x00020104)
100
#define OID_GEN_RCV_NO_BUFFER cpu_to_le32(0x00020105)
102
#define OID_802_3_CURRENT_ADDRESS cpu_to_le32(0x01010102)
103
#define OID_802_3_MULTICAST_LIST cpu_to_le32(0x01010103)
104
#define OID_802_3_MAXIMUM_LIST_SIZE cpu_to_le32(0x01010104)
106
#define OID_802_11_BSSID cpu_to_le32(0x0d010101)
107
#define OID_802_11_SSID cpu_to_le32(0x0d010102)
108
#define OID_802_11_INFRASTRUCTURE_MODE cpu_to_le32(0x0d010108)
109
#define OID_802_11_ADD_WEP cpu_to_le32(0x0d010113)
110
#define OID_802_11_REMOVE_WEP cpu_to_le32(0x0d010114)
111
#define OID_802_11_DISASSOCIATE cpu_to_le32(0x0d010115)
112
#define OID_802_11_AUTHENTICATION_MODE cpu_to_le32(0x0d010118)
113
#define OID_802_11_PRIVACY_FILTER cpu_to_le32(0x0d010119)
114
#define OID_802_11_BSSID_LIST_SCAN cpu_to_le32(0x0d01011a)
115
#define OID_802_11_ENCRYPTION_STATUS cpu_to_le32(0x0d01011b)
116
#define OID_802_11_ADD_KEY cpu_to_le32(0x0d01011d)
117
#define OID_802_11_REMOVE_KEY cpu_to_le32(0x0d01011e)
118
#define OID_802_11_ASSOCIATION_INFORMATION cpu_to_le32(0x0d01011f)
119
#define OID_802_11_CAPABILITY cpu_to_le32(0x0d010122)
120
#define OID_802_11_PMKID cpu_to_le32(0x0d010123)
121
#define OID_802_11_NETWORK_TYPES_SUPPORTED cpu_to_le32(0x0d010203)
122
#define OID_802_11_NETWORK_TYPE_IN_USE cpu_to_le32(0x0d010204)
123
#define OID_802_11_TX_POWER_LEVEL cpu_to_le32(0x0d010205)
124
#define OID_802_11_RSSI cpu_to_le32(0x0d010206)
125
#define OID_802_11_RSSI_TRIGGER cpu_to_le32(0x0d010207)
126
#define OID_802_11_FRAGMENTATION_THRESHOLD cpu_to_le32(0x0d010209)
127
#define OID_802_11_RTS_THRESHOLD cpu_to_le32(0x0d01020a)
128
#define OID_802_11_SUPPORTED_RATES cpu_to_le32(0x0d01020e)
129
#define OID_802_11_CONFIGURATION cpu_to_le32(0x0d010211)
130
#define OID_802_11_POWER_MODE cpu_to_le32(0x0d010216)
131
#define OID_802_11_BSSID_LIST cpu_to_le32(0x0d010217)
134
91
/* Typical noise/maximum signal level values taken from ndiswrapper iw_ndis.h */
135
92
#define WL_NOISE -96 /* typical noise level in dBm */
136
93
#define WL_SIGMAX -32 /* typical maximum signal level in dBm */
673
static const char *oid_to_string(__le32 oid)
620
static const char *oid_to_string(u32 oid)
676
623
#define OID_STR(oid) case oid: return(#oid)
677
624
/* from rndis_host.h */
678
OID_STR(OID_802_3_PERMANENT_ADDRESS);
679
OID_STR(OID_GEN_MAXIMUM_FRAME_SIZE);
680
OID_STR(OID_GEN_CURRENT_PACKET_FILTER);
681
OID_STR(OID_GEN_PHYSICAL_MEDIUM);
625
OID_STR(RNDIS_OID_802_3_PERMANENT_ADDRESS);
626
OID_STR(RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE);
627
OID_STR(RNDIS_OID_GEN_CURRENT_PACKET_FILTER);
628
OID_STR(RNDIS_OID_GEN_PHYSICAL_MEDIUM);
683
630
/* from rndis_wlan.c */
684
OID_STR(OID_GEN_LINK_SPEED);
685
OID_STR(OID_GEN_RNDIS_CONFIG_PARAMETER);
687
OID_STR(OID_GEN_XMIT_OK);
688
OID_STR(OID_GEN_RCV_OK);
689
OID_STR(OID_GEN_XMIT_ERROR);
690
OID_STR(OID_GEN_RCV_ERROR);
691
OID_STR(OID_GEN_RCV_NO_BUFFER);
693
OID_STR(OID_802_3_CURRENT_ADDRESS);
694
OID_STR(OID_802_3_MULTICAST_LIST);
695
OID_STR(OID_802_3_MAXIMUM_LIST_SIZE);
697
OID_STR(OID_802_11_BSSID);
698
OID_STR(OID_802_11_SSID);
699
OID_STR(OID_802_11_INFRASTRUCTURE_MODE);
700
OID_STR(OID_802_11_ADD_WEP);
701
OID_STR(OID_802_11_REMOVE_WEP);
702
OID_STR(OID_802_11_DISASSOCIATE);
703
OID_STR(OID_802_11_AUTHENTICATION_MODE);
704
OID_STR(OID_802_11_PRIVACY_FILTER);
705
OID_STR(OID_802_11_BSSID_LIST_SCAN);
706
OID_STR(OID_802_11_ENCRYPTION_STATUS);
707
OID_STR(OID_802_11_ADD_KEY);
708
OID_STR(OID_802_11_REMOVE_KEY);
709
OID_STR(OID_802_11_ASSOCIATION_INFORMATION);
710
OID_STR(OID_802_11_CAPABILITY);
711
OID_STR(OID_802_11_PMKID);
712
OID_STR(OID_802_11_NETWORK_TYPES_SUPPORTED);
713
OID_STR(OID_802_11_NETWORK_TYPE_IN_USE);
714
OID_STR(OID_802_11_TX_POWER_LEVEL);
715
OID_STR(OID_802_11_RSSI);
716
OID_STR(OID_802_11_RSSI_TRIGGER);
717
OID_STR(OID_802_11_FRAGMENTATION_THRESHOLD);
718
OID_STR(OID_802_11_RTS_THRESHOLD);
719
OID_STR(OID_802_11_SUPPORTED_RATES);
720
OID_STR(OID_802_11_CONFIGURATION);
721
OID_STR(OID_802_11_POWER_MODE);
722
OID_STR(OID_802_11_BSSID_LIST);
631
OID_STR(RNDIS_OID_GEN_LINK_SPEED);
632
OID_STR(RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER);
634
OID_STR(RNDIS_OID_GEN_XMIT_OK);
635
OID_STR(RNDIS_OID_GEN_RCV_OK);
636
OID_STR(RNDIS_OID_GEN_XMIT_ERROR);
637
OID_STR(RNDIS_OID_GEN_RCV_ERROR);
638
OID_STR(RNDIS_OID_GEN_RCV_NO_BUFFER);
640
OID_STR(RNDIS_OID_802_3_CURRENT_ADDRESS);
641
OID_STR(RNDIS_OID_802_3_MULTICAST_LIST);
642
OID_STR(RNDIS_OID_802_3_MAXIMUM_LIST_SIZE);
644
OID_STR(RNDIS_OID_802_11_BSSID);
645
OID_STR(RNDIS_OID_802_11_SSID);
646
OID_STR(RNDIS_OID_802_11_INFRASTRUCTURE_MODE);
647
OID_STR(RNDIS_OID_802_11_ADD_WEP);
648
OID_STR(RNDIS_OID_802_11_REMOVE_WEP);
649
OID_STR(RNDIS_OID_802_11_DISASSOCIATE);
650
OID_STR(RNDIS_OID_802_11_AUTHENTICATION_MODE);
651
OID_STR(RNDIS_OID_802_11_PRIVACY_FILTER);
652
OID_STR(RNDIS_OID_802_11_BSSID_LIST_SCAN);
653
OID_STR(RNDIS_OID_802_11_ENCRYPTION_STATUS);
654
OID_STR(RNDIS_OID_802_11_ADD_KEY);
655
OID_STR(RNDIS_OID_802_11_REMOVE_KEY);
656
OID_STR(RNDIS_OID_802_11_ASSOCIATION_INFORMATION);
657
OID_STR(RNDIS_OID_802_11_CAPABILITY);
658
OID_STR(RNDIS_OID_802_11_PMKID);
659
OID_STR(RNDIS_OID_802_11_NETWORK_TYPES_SUPPORTED);
660
OID_STR(RNDIS_OID_802_11_NETWORK_TYPE_IN_USE);
661
OID_STR(RNDIS_OID_802_11_TX_POWER_LEVEL);
662
OID_STR(RNDIS_OID_802_11_RSSI);
663
OID_STR(RNDIS_OID_802_11_RSSI_TRIGGER);
664
OID_STR(RNDIS_OID_802_11_FRAGMENTATION_THRESHOLD);
665
OID_STR(RNDIS_OID_802_11_RTS_THRESHOLD);
666
OID_STR(RNDIS_OID_802_11_SUPPORTED_RATES);
667
OID_STR(RNDIS_OID_802_11_CONFIGURATION);
668
OID_STR(RNDIS_OID_802_11_POWER_MODE);
669
OID_STR(RNDIS_OID_802_11_BSSID_LIST);
729
static const char *oid_to_string(__le32 oid)
676
static const char *oid_to_string(u32 oid)
1594
1560
memset(remove_key.bssid, 0xff,
1595
1561
sizeof(remove_key.bssid));
1597
ret = rndis_set_oid(usbdev, OID_802_11_REMOVE_KEY, &remove_key,
1598
sizeof(remove_key));
1563
ret = rndis_set_oid(usbdev,
1564
RNDIS_OID_802_11_REMOVE_KEY,
1565
&remove_key, sizeof(remove_key));
1602
1569
keyindex = cpu_to_le32(index);
1603
ret = rndis_set_oid(usbdev, OID_802_11_REMOVE_WEP, &keyindex,
1570
ret = rndis_set_oid(usbdev,
1571
RNDIS_OID_802_11_REMOVE_WEP,
1572
&keyindex, sizeof(keyindex));
1605
1573
if (ret != 0) {
1606
1574
netdev_warn(usbdev->net,
1607
1575
"removing encryption key %d failed (%08X)\n",
1669
1637
goto set_filter;
1671
1639
if (mc_count) {
1672
ret = rndis_set_oid(usbdev, OID_802_3_MULTICAST_LIST, mc_addrs,
1673
mc_count * ETH_ALEN);
1640
ret = rndis_set_oid(usbdev,
1641
RNDIS_OID_802_3_MULTICAST_LIST,
1642
mc_addrs, mc_count * ETH_ALEN);
1674
1643
kfree(mc_addrs);
1676
filter |= RNDIS_PACKET_TYPE_MULTICAST;
1645
filter |= cpu_to_le32(RNDIS_PACKET_TYPE_MULTICAST);
1678
filter |= RNDIS_PACKET_TYPE_ALL_MULTICAST;
1647
filter |= cpu_to_le32(RNDIS_PACKET_TYPE_ALL_MULTICAST);
1680
netdev_dbg(usbdev->net, "OID_802_3_MULTICAST_LIST(%d, max: %d) -> %d\n",
1649
netdev_dbg(usbdev->net, "RNDIS_OID_802_3_MULTICAST_LIST(%d, max: %d) -> %d\n",
1681
1650
mc_count, priv->multicast_size, ret);
1685
ret = rndis_set_oid(usbdev, OID_GEN_CURRENT_PACKET_FILTER, &filter,
1654
ret = rndis_set_oid(usbdev, RNDIS_OID_GEN_CURRENT_PACKET_FILTER, &filter,
1686
1655
sizeof(filter));
1688
1657
netdev_warn(usbdev->net, "couldn't set packet filter: %08x\n",
1689
1658
le32_to_cpu(filter));
1692
netdev_dbg(usbdev->net, "OID_GEN_CURRENT_PACKET_FILTER(%08x) -> %d\n",
1661
netdev_dbg(usbdev->net, "RNDIS_OID_GEN_CURRENT_PACKET_FILTER(%08x) -> %d\n",
1693
1662
le32_to_cpu(filter), ret);
1777
1747
debug_print_pmkids(usbdev, pmkids, __func__);
1779
ret = rndis_set_oid(usbdev, OID_802_11_PMKID, pmkids,
1780
le32_to_cpu(pmkids->length));
1749
ret = rndis_set_oid(usbdev, RNDIS_OID_802_11_PMKID, pmkids,
1750
le32_to_cpu(pmkids->length));
1782
netdev_dbg(usbdev->net, "%s(): OID_802_11_PMKID(%d, %d) -> %d"
1752
netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_PMKID(%d, %d) -> %d"
1783
1753
"\n", __func__, len, num_pmkids, ret);
2423
2394
return deauthenticate(usbdev);
2426
static int rndis_set_channel(struct wiphy *wiphy, struct net_device *netdev,
2427
struct ieee80211_channel *chan, enum nl80211_channel_type channel_type)
2429
struct rndis_wlan_private *priv = wiphy_priv(wiphy);
2430
struct usbnet *usbdev = priv->usbdev;
2432
return set_channel(usbdev,
2433
ieee80211_frequency_to_channel(chan->center_freq));
2436
2397
static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev,
2437
2398
u8 key_index, bool pairwise, const u8 *mac_addr,
2438
2399
struct key_params *params)
2511
2472
memset(sinfo, 0, sizeof(*sinfo));
2513
2474
len = sizeof(linkspeed);
2514
ret = rndis_query_oid(usbdev, OID_GEN_LINK_SPEED, &linkspeed, &len);
2475
ret = rndis_query_oid(usbdev, RNDIS_OID_GEN_LINK_SPEED, &linkspeed, &len);
2515
2476
if (ret == 0) {
2516
2477
sinfo->txrate.legacy = le32_to_cpu(linkspeed) / 1000;
2517
2478
sinfo->filled |= STATION_INFO_TX_BITRATE;
2520
2481
len = sizeof(rssi);
2521
ret = rndis_query_oid(usbdev, OID_802_11_RSSI, &rssi, &len);
2482
ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_RSSI,
2522
2484
if (ret == 0) {
2523
2485
sinfo->signal = level_to_qual(le32_to_cpu(rssi));
2524
2486
sinfo->filled |= STATION_INFO_SIGNAL;
2693
2657
/* Get signal quality, in case of error use rssi=0 and ignore error. */
2694
2658
len = sizeof(rssi);
2696
ret = rndis_query_oid(usbdev, OID_802_11_RSSI, &rssi, &len);
2660
ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_RSSI,
2697
2662
signal = level_to_qual(le32_to_cpu(rssi));
2699
netdev_dbg(usbdev->net, "%s(): OID_802_11_RSSI -> %d, "
2664
netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_RSSI -> %d, "
2700
2665
"rssi:%d, qual: %d\n", __func__, ret, le32_to_cpu(rssi),
2701
2666
level_to_qual(le32_to_cpu(rssi)));
2720
2685
/* Get SSID, in case of error, use zero length SSID and ignore error. */
2721
2686
len = sizeof(ssid);
2722
2687
memset(&ssid, 0, sizeof(ssid));
2723
ret = rndis_query_oid(usbdev, OID_802_11_SSID, &ssid, &len);
2724
netdev_dbg(usbdev->net, "%s(): OID_802_11_SSID -> %d, len: %d, ssid: "
2688
ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_SSID,
2690
netdev_dbg(usbdev->net, "%s(): RNDIS_OID_802_11_SSID -> %d, len: %d, ssid: "
2725
2691
"'%.32s'\n", __func__, ret,
2726
2692
le32_to_cpu(ssid.length), ssid.essid);
3095
3061
struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev);
3096
3062
struct rndis_indicate *msg = ind;
3098
switch (msg->status) {
3064
switch (le32_to_cpu(msg->status)) {
3099
3065
case RNDIS_STATUS_MEDIA_CONNECT:
3100
if (priv->current_command_oid == OID_802_11_ADD_KEY) {
3101
/* OID_802_11_ADD_KEY causes sometimes extra
3066
if (priv->current_command_oid == RNDIS_OID_802_11_ADD_KEY) {
3067
/* RNDIS_OID_802_11_ADD_KEY causes sometimes extra
3102
3068
* "media connect" indications which confuses driver
3103
3069
* and userspace to think that device is
3104
3070
* roaming/reassociating when it isn't.
3106
netdev_dbg(usbdev->net, "ignored OID_802_11_ADD_KEY triggered 'media connect'\n");
3072
netdev_dbg(usbdev->net, "ignored RNDIS_OID_802_11_ADD_KEY triggered 'media connect'\n");
3173
3140
/* get device 802.11 capabilities, number of PMKIDs */
3174
3141
caps = (struct ndis_80211_capability *)caps_buf;
3175
3142
len = sizeof(caps_buf);
3176
retval = rndis_query_oid(usbdev, OID_802_11_CAPABILITY, caps, &len);
3143
retval = rndis_query_oid(usbdev,
3144
RNDIS_OID_802_11_CAPABILITY,
3177
3146
if (retval >= 0) {
3178
netdev_dbg(usbdev->net, "OID_802_11_CAPABILITY -> len %d, "
3147
netdev_dbg(usbdev->net, "RNDIS_OID_802_11_CAPABILITY -> len %d, "
3179
3148
"ver %d, pmkids %d, auth-encr-pairs %d\n",
3180
3149
le32_to_cpu(caps->length),
3181
3150
le32_to_cpu(caps->version),
3249
3218
len = sizeof(rssi);
3250
ret = rndis_query_oid(usbdev, OID_802_11_RSSI, &rssi, &len);
3219
ret = rndis_query_oid(usbdev, RNDIS_OID_802_11_RSSI,
3251
3221
if (ret == 0) {
3252
3222
priv->last_qual = level_to_qual(le32_to_cpu(rssi));
3253
3223
rndis_do_cqm(usbdev, le32_to_cpu(rssi));
3256
netdev_dbg(usbdev->net, "dev-poller: OID_802_11_RSSI -> %d, rssi:%d, qual: %d\n",
3226
netdev_dbg(usbdev->net, "dev-poller: RNDIS_OID_802_11_RSSI -> %d, rssi:%d, qual: %d\n",
3257
3227
ret, le32_to_cpu(rssi), level_to_qual(le32_to_cpu(rssi)));
3259
3229
/* Workaround transfer stalls on poor quality links.
3466
3439
usbdev->net->netdev_ops = &rndis_wlan_netdev_ops;
3468
tmp = RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST;
3469
retval = rndis_set_oid(usbdev, OID_GEN_CURRENT_PACKET_FILTER, &tmp,
3441
tmp = cpu_to_le32(RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST);
3442
retval = rndis_set_oid(usbdev,
3443
RNDIS_OID_GEN_CURRENT_PACKET_FILTER,
3472
3446
len = sizeof(tmp);
3473
retval = rndis_query_oid(usbdev, OID_802_3_MAXIMUM_LIST_SIZE, &tmp,
3447
retval = rndis_query_oid(usbdev,
3448
RNDIS_OID_802_3_MAXIMUM_LIST_SIZE,
3475
3450
priv->multicast_size = le32_to_cpu(tmp);
3476
3451
if (retval < 0 || priv->multicast_size < 0)
3477
3452
priv->multicast_size = 0;