diff options
Diffstat (limited to 'drivers/net')
35 files changed, 502 insertions, 365 deletions
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index 9c149750e2bf..284a5f4a63ac 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -598,8 +598,8 @@ rx_next: | |||
598 | goto rx_status_loop; | 598 | goto rx_status_loop; |
599 | 599 | ||
600 | spin_lock_irqsave(&cp->lock, flags); | 600 | spin_lock_irqsave(&cp->lock, flags); |
601 | cpw16_f(IntrMask, cp_intr_mask); | ||
602 | __napi_complete(napi); | 601 | __napi_complete(napi); |
602 | cpw16_f(IntrMask, cp_intr_mask); | ||
603 | spin_unlock_irqrestore(&cp->lock, flags); | 603 | spin_unlock_irqrestore(&cp->lock, flags); |
604 | } | 604 | } |
605 | 605 | ||
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index 4ba72933f0da..97d8068b372b 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
@@ -860,6 +860,7 @@ retry: | |||
860 | } | 860 | } |
861 | 861 | ||
862 | /* if unknown chip, assume array element #0, original RTL-8139 in this case */ | 862 | /* if unknown chip, assume array element #0, original RTL-8139 in this case */ |
863 | i = 0; | ||
863 | dev_dbg(&pdev->dev, "unknown chip version, assuming RTL-8139\n"); | 864 | dev_dbg(&pdev->dev, "unknown chip version, assuming RTL-8139\n"); |
864 | dev_dbg(&pdev->dev, "TxConfig = 0x%lx\n", RTL_R32 (TxConfig)); | 865 | dev_dbg(&pdev->dev, "TxConfig = 0x%lx\n", RTL_R32 (TxConfig)); |
865 | tp->chipset = 0; | 866 | tp->chipset = 0; |
@@ -2088,8 +2089,8 @@ static int rtl8139_poll(struct napi_struct *napi, int budget) | |||
2088 | * again when we think we are done. | 2089 | * again when we think we are done. |
2089 | */ | 2090 | */ |
2090 | spin_lock_irqsave(&tp->lock, flags); | 2091 | spin_lock_irqsave(&tp->lock, flags); |
2091 | RTL_W16_F(IntrMask, rtl8139_intr_mask); | ||
2092 | __napi_complete(napi); | 2092 | __napi_complete(napi); |
2093 | RTL_W16_F(IntrMask, rtl8139_intr_mask); | ||
2093 | spin_unlock_irqrestore(&tp->lock, flags); | 2094 | spin_unlock_irqrestore(&tp->lock, flags); |
2094 | } | 2095 | } |
2095 | spin_unlock(&tp->rx_lock); | 2096 | spin_unlock(&tp->rx_lock); |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 188e356c30a3..949d7a9dcf92 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -247,6 +247,7 @@ static const struct flash_spec flash_5709 = { | |||
247 | MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); | 247 | MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); |
248 | 248 | ||
249 | static void bnx2_init_napi(struct bnx2 *bp); | 249 | static void bnx2_init_napi(struct bnx2 *bp); |
250 | static void bnx2_del_napi(struct bnx2 *bp); | ||
250 | 251 | ||
251 | static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr) | 252 | static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr) |
252 | { | 253 | { |
@@ -6270,6 +6271,7 @@ open_err: | |||
6270 | bnx2_free_skbs(bp); | 6271 | bnx2_free_skbs(bp); |
6271 | bnx2_free_irq(bp); | 6272 | bnx2_free_irq(bp); |
6272 | bnx2_free_mem(bp); | 6273 | bnx2_free_mem(bp); |
6274 | bnx2_del_napi(bp); | ||
6273 | return rc; | 6275 | return rc; |
6274 | } | 6276 | } |
6275 | 6277 | ||
@@ -6537,6 +6539,7 @@ bnx2_close(struct net_device *dev) | |||
6537 | bnx2_free_irq(bp); | 6539 | bnx2_free_irq(bp); |
6538 | bnx2_free_skbs(bp); | 6540 | bnx2_free_skbs(bp); |
6539 | bnx2_free_mem(bp); | 6541 | bnx2_free_mem(bp); |
6542 | bnx2_del_napi(bp); | ||
6540 | bp->link_up = 0; | 6543 | bp->link_up = 0; |
6541 | netif_carrier_off(bp->dev); | 6544 | netif_carrier_off(bp->dev); |
6542 | bnx2_set_power_state(bp, PCI_D3hot); | 6545 | bnx2_set_power_state(bp, PCI_D3hot); |
@@ -8227,7 +8230,16 @@ bnx2_bus_string(struct bnx2 *bp, char *str) | |||
8227 | return str; | 8230 | return str; |
8228 | } | 8231 | } |
8229 | 8232 | ||
8230 | static void __devinit | 8233 | static void |
8234 | bnx2_del_napi(struct bnx2 *bp) | ||
8235 | { | ||
8236 | int i; | ||
8237 | |||
8238 | for (i = 0; i < bp->irq_nvecs; i++) | ||
8239 | netif_napi_del(&bp->bnx2_napi[i].napi); | ||
8240 | } | ||
8241 | |||
8242 | static void | ||
8231 | bnx2_init_napi(struct bnx2 *bp) | 8243 | bnx2_init_napi(struct bnx2 *bp) |
8232 | { | 8244 | { |
8233 | int i; | 8245 | int i; |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 24507f3b8b17..57a7e41da69e 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -2554,7 +2554,7 @@ static void e1000_init_manageability_pt(struct e1000_adapter *adapter) | |||
2554 | mdef = er32(MDEF(i)); | 2554 | mdef = er32(MDEF(i)); |
2555 | 2555 | ||
2556 | /* Ignore filters with anything other than IPMI ports */ | 2556 | /* Ignore filters with anything other than IPMI ports */ |
2557 | if (mdef & !(E1000_MDEF_PORT_623 | E1000_MDEF_PORT_664)) | 2557 | if (mdef & ~(E1000_MDEF_PORT_623 | E1000_MDEF_PORT_664)) |
2558 | continue; | 2558 | continue; |
2559 | 2559 | ||
2560 | /* Enable this decision filter in MANC2H */ | 2560 | /* Enable this decision filter in MANC2H */ |
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h index 85f2a2e7030a..45e86d1e5b1b 100644 --- a/drivers/net/enic/enic.h +++ b/drivers/net/enic/enic.h | |||
@@ -74,7 +74,14 @@ struct enic_msix_entry { | |||
74 | void *devid; | 74 | void *devid; |
75 | }; | 75 | }; |
76 | 76 | ||
77 | #define ENIC_SET_APPLIED (1 << 0) | ||
78 | #define ENIC_SET_REQUEST (1 << 1) | ||
79 | #define ENIC_SET_NAME (1 << 2) | ||
80 | #define ENIC_SET_INSTANCE (1 << 3) | ||
81 | #define ENIC_SET_HOST (1 << 4) | ||
82 | |||
77 | struct enic_port_profile { | 83 | struct enic_port_profile { |
84 | u32 set; | ||
78 | u8 request; | 85 | u8 request; |
79 | char name[PORT_PROFILE_MAX]; | 86 | char name[PORT_PROFILE_MAX]; |
80 | u8 instance_uuid[PORT_UUID_MAX]; | 87 | u8 instance_uuid[PORT_UUID_MAX]; |
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c index 6586b5c7e4b6..bc7d6b96de3d 100644 --- a/drivers/net/enic/enic_main.c +++ b/drivers/net/enic/enic_main.c | |||
@@ -1029,8 +1029,7 @@ static int enic_dev_init_done(struct enic *enic, int *done, int *error) | |||
1029 | return err; | 1029 | return err; |
1030 | } | 1030 | } |
1031 | 1031 | ||
1032 | static int enic_set_port_profile(struct enic *enic, u8 request, u8 *mac, | 1032 | static int enic_set_port_profile(struct enic *enic, u8 *mac) |
1033 | char *name, u8 *instance_uuid, u8 *host_uuid) | ||
1034 | { | 1033 | { |
1035 | struct vic_provinfo *vp; | 1034 | struct vic_provinfo *vp; |
1036 | u8 oui[3] = VIC_PROVINFO_CISCO_OUI; | 1035 | u8 oui[3] = VIC_PROVINFO_CISCO_OUI; |
@@ -1040,97 +1039,112 @@ static int enic_set_port_profile(struct enic *enic, u8 request, u8 *mac, | |||
1040 | "%02X%02X-%02X%02X%02X%02X%0X%02X"; | 1039 | "%02X%02X-%02X%02X%02X%02X%0X%02X"; |
1041 | int err; | 1040 | int err; |
1042 | 1041 | ||
1043 | if (!name) | 1042 | err = enic_vnic_dev_deinit(enic); |
1044 | return -EINVAL; | 1043 | if (err) |
1044 | return err; | ||
1045 | 1045 | ||
1046 | if (!is_valid_ether_addr(mac)) | 1046 | switch (enic->pp.request) { |
1047 | return -EADDRNOTAVAIL; | ||
1048 | 1047 | ||
1049 | vp = vic_provinfo_alloc(GFP_KERNEL, oui, VIC_PROVINFO_LINUX_TYPE); | 1048 | case PORT_REQUEST_ASSOCIATE: |
1050 | if (!vp) | ||
1051 | return -ENOMEM; | ||
1052 | 1049 | ||
1053 | vic_provinfo_add_tlv(vp, | 1050 | if (!(enic->pp.set & ENIC_SET_NAME) || !strlen(enic->pp.name)) |
1054 | VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR, | 1051 | return -EINVAL; |
1055 | strlen(name) + 1, name); | ||
1056 | |||
1057 | vic_provinfo_add_tlv(vp, | ||
1058 | VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR, | ||
1059 | ETH_ALEN, mac); | ||
1060 | |||
1061 | if (instance_uuid) { | ||
1062 | uuid = instance_uuid; | ||
1063 | sprintf(uuid_str, uuid_fmt, | ||
1064 | uuid[0], uuid[1], uuid[2], uuid[3], | ||
1065 | uuid[4], uuid[5], uuid[6], uuid[7], | ||
1066 | uuid[8], uuid[9], uuid[10], uuid[11], | ||
1067 | uuid[12], uuid[13], uuid[14], uuid[15]); | ||
1068 | vic_provinfo_add_tlv(vp, | ||
1069 | VIC_LINUX_PROV_TLV_CLIENT_UUID_STR, | ||
1070 | sizeof(uuid_str), uuid_str); | ||
1071 | } | ||
1072 | 1052 | ||
1073 | if (host_uuid) { | 1053 | if (!is_valid_ether_addr(mac)) |
1074 | uuid = host_uuid; | 1054 | return -EADDRNOTAVAIL; |
1075 | sprintf(uuid_str, uuid_fmt, | ||
1076 | uuid[0], uuid[1], uuid[2], uuid[3], | ||
1077 | uuid[4], uuid[5], uuid[6], uuid[7], | ||
1078 | uuid[8], uuid[9], uuid[10], uuid[11], | ||
1079 | uuid[12], uuid[13], uuid[14], uuid[15]); | ||
1080 | vic_provinfo_add_tlv(vp, | ||
1081 | VIC_LINUX_PROV_TLV_HOST_UUID_STR, | ||
1082 | sizeof(uuid_str), uuid_str); | ||
1083 | } | ||
1084 | 1055 | ||
1085 | err = enic_vnic_dev_deinit(enic); | 1056 | vp = vic_provinfo_alloc(GFP_KERNEL, oui, |
1086 | if (err) | 1057 | VIC_PROVINFO_LINUX_TYPE); |
1087 | goto err_out; | 1058 | if (!vp) |
1059 | return -ENOMEM; | ||
1088 | 1060 | ||
1089 | memset(&enic->pp, 0, sizeof(enic->pp)); | 1061 | vic_provinfo_add_tlv(vp, |
1062 | VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR, | ||
1063 | strlen(enic->pp.name) + 1, enic->pp.name); | ||
1090 | 1064 | ||
1091 | err = enic_dev_init_prov(enic, vp); | 1065 | vic_provinfo_add_tlv(vp, |
1092 | if (err) | 1066 | VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR, |
1093 | goto err_out; | 1067 | ETH_ALEN, mac); |
1068 | |||
1069 | if (enic->pp.set & ENIC_SET_INSTANCE) { | ||
1070 | uuid = enic->pp.instance_uuid; | ||
1071 | sprintf(uuid_str, uuid_fmt, | ||
1072 | uuid[0], uuid[1], uuid[2], uuid[3], | ||
1073 | uuid[4], uuid[5], uuid[6], uuid[7], | ||
1074 | uuid[8], uuid[9], uuid[10], uuid[11], | ||
1075 | uuid[12], uuid[13], uuid[14], uuid[15]); | ||
1076 | vic_provinfo_add_tlv(vp, | ||
1077 | VIC_LINUX_PROV_TLV_CLIENT_UUID_STR, | ||
1078 | sizeof(uuid_str), uuid_str); | ||
1079 | } | ||
1094 | 1080 | ||
1095 | enic->pp.request = request; | 1081 | if (enic->pp.set & ENIC_SET_HOST) { |
1096 | memcpy(enic->pp.name, name, PORT_PROFILE_MAX); | 1082 | uuid = enic->pp.host_uuid; |
1097 | if (instance_uuid) | 1083 | sprintf(uuid_str, uuid_fmt, |
1098 | memcpy(enic->pp.instance_uuid, | 1084 | uuid[0], uuid[1], uuid[2], uuid[3], |
1099 | instance_uuid, PORT_UUID_MAX); | 1085 | uuid[4], uuid[5], uuid[6], uuid[7], |
1100 | if (host_uuid) | 1086 | uuid[8], uuid[9], uuid[10], uuid[11], |
1101 | memcpy(enic->pp.host_uuid, | 1087 | uuid[12], uuid[13], uuid[14], uuid[15]); |
1102 | host_uuid, PORT_UUID_MAX); | 1088 | vic_provinfo_add_tlv(vp, |
1089 | VIC_LINUX_PROV_TLV_HOST_UUID_STR, | ||
1090 | sizeof(uuid_str), uuid_str); | ||
1091 | } | ||
1103 | 1092 | ||
1104 | err_out: | 1093 | err = enic_dev_init_prov(enic, vp); |
1105 | vic_provinfo_free(vp); | 1094 | vic_provinfo_free(vp); |
1095 | if (err) | ||
1096 | return err; | ||
1097 | break; | ||
1106 | 1098 | ||
1107 | return err; | 1099 | case PORT_REQUEST_DISASSOCIATE: |
1108 | } | 1100 | break; |
1109 | 1101 | ||
1110 | static int enic_unset_port_profile(struct enic *enic) | 1102 | default: |
1111 | { | 1103 | return -EINVAL; |
1112 | memset(&enic->pp, 0, sizeof(enic->pp)); | 1104 | } |
1113 | return enic_vnic_dev_deinit(enic); | 1105 | |
1106 | enic->pp.set |= ENIC_SET_APPLIED; | ||
1107 | return 0; | ||
1114 | } | 1108 | } |
1115 | 1109 | ||
1116 | static int enic_set_vf_port(struct net_device *netdev, int vf, | 1110 | static int enic_set_vf_port(struct net_device *netdev, int vf, |
1117 | struct nlattr *port[]) | 1111 | struct nlattr *port[]) |
1118 | { | 1112 | { |
1119 | struct enic *enic = netdev_priv(netdev); | 1113 | struct enic *enic = netdev_priv(netdev); |
1120 | char *name = NULL; | 1114 | |
1121 | u8 *instance_uuid = NULL; | 1115 | memset(&enic->pp, 0, sizeof(enic->pp)); |
1122 | u8 *host_uuid = NULL; | 1116 | |
1123 | u8 request = PORT_REQUEST_DISASSOCIATE; | 1117 | if (port[IFLA_PORT_REQUEST]) { |
1118 | enic->pp.set |= ENIC_SET_REQUEST; | ||
1119 | enic->pp.request = nla_get_u8(port[IFLA_PORT_REQUEST]); | ||
1120 | } | ||
1121 | |||
1122 | if (port[IFLA_PORT_PROFILE]) { | ||
1123 | enic->pp.set |= ENIC_SET_NAME; | ||
1124 | memcpy(enic->pp.name, nla_data(port[IFLA_PORT_PROFILE]), | ||
1125 | PORT_PROFILE_MAX); | ||
1126 | } | ||
1127 | |||
1128 | if (port[IFLA_PORT_INSTANCE_UUID]) { | ||
1129 | enic->pp.set |= ENIC_SET_INSTANCE; | ||
1130 | memcpy(enic->pp.instance_uuid, | ||
1131 | nla_data(port[IFLA_PORT_INSTANCE_UUID]), PORT_UUID_MAX); | ||
1132 | } | ||
1133 | |||
1134 | if (port[IFLA_PORT_HOST_UUID]) { | ||
1135 | enic->pp.set |= ENIC_SET_HOST; | ||
1136 | memcpy(enic->pp.host_uuid, | ||
1137 | nla_data(port[IFLA_PORT_HOST_UUID]), PORT_UUID_MAX); | ||
1138 | } | ||
1124 | 1139 | ||
1125 | /* don't support VFs, yet */ | 1140 | /* don't support VFs, yet */ |
1126 | if (vf != PORT_SELF_VF) | 1141 | if (vf != PORT_SELF_VF) |
1127 | return -EOPNOTSUPP; | 1142 | return -EOPNOTSUPP; |
1128 | 1143 | ||
1129 | if (port[IFLA_PORT_REQUEST]) | 1144 | if (!(enic->pp.set & ENIC_SET_REQUEST)) |
1130 | request = nla_get_u8(port[IFLA_PORT_REQUEST]); | 1145 | return -EOPNOTSUPP; |
1131 | 1146 | ||
1132 | switch (request) { | 1147 | if (enic->pp.request == PORT_REQUEST_ASSOCIATE) { |
1133 | case PORT_REQUEST_ASSOCIATE: | ||
1134 | 1148 | ||
1135 | /* If the interface mac addr hasn't been assigned, | 1149 | /* If the interface mac addr hasn't been assigned, |
1136 | * assign a random mac addr before setting port- | 1150 | * assign a random mac addr before setting port- |
@@ -1139,30 +1153,9 @@ static int enic_set_vf_port(struct net_device *netdev, int vf, | |||
1139 | 1153 | ||
1140 | if (is_zero_ether_addr(netdev->dev_addr)) | 1154 | if (is_zero_ether_addr(netdev->dev_addr)) |
1141 | random_ether_addr(netdev->dev_addr); | 1155 | random_ether_addr(netdev->dev_addr); |
1142 | |||
1143 | if (port[IFLA_PORT_PROFILE]) | ||
1144 | name = nla_data(port[IFLA_PORT_PROFILE]); | ||
1145 | |||
1146 | if (port[IFLA_PORT_INSTANCE_UUID]) | ||
1147 | instance_uuid = | ||
1148 | nla_data(port[IFLA_PORT_INSTANCE_UUID]); | ||
1149 | |||
1150 | if (port[IFLA_PORT_HOST_UUID]) | ||
1151 | host_uuid = nla_data(port[IFLA_PORT_HOST_UUID]); | ||
1152 | |||
1153 | return enic_set_port_profile(enic, request, | ||
1154 | netdev->dev_addr, name, | ||
1155 | instance_uuid, host_uuid); | ||
1156 | |||
1157 | case PORT_REQUEST_DISASSOCIATE: | ||
1158 | |||
1159 | return enic_unset_port_profile(enic); | ||
1160 | |||
1161 | default: | ||
1162 | break; | ||
1163 | } | 1156 | } |
1164 | 1157 | ||
1165 | return -EOPNOTSUPP; | 1158 | return enic_set_port_profile(enic, netdev->dev_addr); |
1166 | } | 1159 | } |
1167 | 1160 | ||
1168 | static int enic_get_vf_port(struct net_device *netdev, int vf, | 1161 | static int enic_get_vf_port(struct net_device *netdev, int vf, |
@@ -1172,14 +1165,12 @@ static int enic_get_vf_port(struct net_device *netdev, int vf, | |||
1172 | int err, error, done; | 1165 | int err, error, done; |
1173 | u16 response = PORT_PROFILE_RESPONSE_SUCCESS; | 1166 | u16 response = PORT_PROFILE_RESPONSE_SUCCESS; |
1174 | 1167 | ||
1175 | /* don't support VFs, yet */ | 1168 | if (!(enic->pp.set & ENIC_SET_APPLIED)) |
1176 | if (vf != PORT_SELF_VF) | 1169 | return -ENODATA; |
1177 | return -EOPNOTSUPP; | ||
1178 | 1170 | ||
1179 | err = enic_dev_init_done(enic, &done, &error); | 1171 | err = enic_dev_init_done(enic, &done, &error); |
1180 | |||
1181 | if (err) | 1172 | if (err) |
1182 | return err; | 1173 | error = err; |
1183 | 1174 | ||
1184 | switch (error) { | 1175 | switch (error) { |
1185 | case ERR_SUCCESS: | 1176 | case ERR_SUCCESS: |
@@ -1202,12 +1193,15 @@ static int enic_get_vf_port(struct net_device *netdev, int vf, | |||
1202 | 1193 | ||
1203 | NLA_PUT_U16(skb, IFLA_PORT_REQUEST, enic->pp.request); | 1194 | NLA_PUT_U16(skb, IFLA_PORT_REQUEST, enic->pp.request); |
1204 | NLA_PUT_U16(skb, IFLA_PORT_RESPONSE, response); | 1195 | NLA_PUT_U16(skb, IFLA_PORT_RESPONSE, response); |
1205 | NLA_PUT(skb, IFLA_PORT_PROFILE, PORT_PROFILE_MAX, | 1196 | if (enic->pp.set & ENIC_SET_NAME) |
1206 | enic->pp.name); | 1197 | NLA_PUT(skb, IFLA_PORT_PROFILE, PORT_PROFILE_MAX, |
1207 | NLA_PUT(skb, IFLA_PORT_INSTANCE_UUID, PORT_UUID_MAX, | 1198 | enic->pp.name); |
1208 | enic->pp.instance_uuid); | 1199 | if (enic->pp.set & ENIC_SET_INSTANCE) |
1209 | NLA_PUT(skb, IFLA_PORT_HOST_UUID, PORT_UUID_MAX, | 1200 | NLA_PUT(skb, IFLA_PORT_INSTANCE_UUID, PORT_UUID_MAX, |
1210 | enic->pp.host_uuid); | 1201 | enic->pp.instance_uuid); |
1202 | if (enic->pp.set & ENIC_SET_HOST) | ||
1203 | NLA_PUT(skb, IFLA_PORT_HOST_UUID, PORT_UUID_MAX, | ||
1204 | enic->pp.host_uuid); | ||
1211 | 1205 | ||
1212 | return 0; | 1206 | return 0; |
1213 | 1207 | ||
diff --git a/drivers/net/epic100.c b/drivers/net/epic100.c index 6838dfc9ef23..4c274657283c 100644 --- a/drivers/net/epic100.c +++ b/drivers/net/epic100.c | |||
@@ -87,6 +87,7 @@ static int rx_copybreak; | |||
87 | #include <linux/bitops.h> | 87 | #include <linux/bitops.h> |
88 | #include <asm/io.h> | 88 | #include <asm/io.h> |
89 | #include <asm/uaccess.h> | 89 | #include <asm/uaccess.h> |
90 | #include <asm/byteorder.h> | ||
90 | 91 | ||
91 | /* These identify the driver base version and may not be removed. */ | 92 | /* These identify the driver base version and may not be removed. */ |
92 | static char version[] __devinitdata = | 93 | static char version[] __devinitdata = |
@@ -230,7 +231,7 @@ static const u16 media2miictl[16] = { | |||
230 | * The EPIC100 Rx and Tx buffer descriptors. Note that these | 231 | * The EPIC100 Rx and Tx buffer descriptors. Note that these |
231 | * really ARE host-endian; it's not a misannotation. We tell | 232 | * really ARE host-endian; it's not a misannotation. We tell |
232 | * the card to byteswap them internally on big-endian hosts - | 233 | * the card to byteswap them internally on big-endian hosts - |
233 | * look for #ifdef CONFIG_BIG_ENDIAN in epic_open(). | 234 | * look for #ifdef __BIG_ENDIAN in epic_open(). |
234 | */ | 235 | */ |
235 | 236 | ||
236 | struct epic_tx_desc { | 237 | struct epic_tx_desc { |
@@ -690,7 +691,7 @@ static int epic_open(struct net_device *dev) | |||
690 | outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); | 691 | outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); |
691 | 692 | ||
692 | /* Tell the chip to byteswap descriptors on big-endian hosts */ | 693 | /* Tell the chip to byteswap descriptors on big-endian hosts */ |
693 | #ifdef CONFIG_BIG_ENDIAN | 694 | #ifdef __BIG_ENDIAN |
694 | outl(0x4432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); | 695 | outl(0x4432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); |
695 | inl(ioaddr + GENCTL); | 696 | inl(ioaddr + GENCTL); |
696 | outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); | 697 | outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); |
@@ -806,7 +807,7 @@ static void epic_restart(struct net_device *dev) | |||
806 | for (i = 16; i > 0; i--) | 807 | for (i = 16; i > 0; i--) |
807 | outl(0x0008, ioaddr + TEST1); | 808 | outl(0x0008, ioaddr + TEST1); |
808 | 809 | ||
809 | #ifdef CONFIG_BIG_ENDIAN | 810 | #ifdef __BIG_ENDIAN |
810 | outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); | 811 | outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); |
811 | #else | 812 | #else |
812 | outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); | 813 | outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL); |
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index ddf7a86cd466..edfff92a6d8e 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
@@ -1373,10 +1373,9 @@ fec_suspend(struct platform_device *dev, pm_message_t state) | |||
1373 | 1373 | ||
1374 | if (ndev) { | 1374 | if (ndev) { |
1375 | fep = netdev_priv(ndev); | 1375 | fep = netdev_priv(ndev); |
1376 | if (netif_running(ndev)) { | 1376 | if (netif_running(ndev)) |
1377 | netif_device_detach(ndev); | 1377 | fec_enet_close(ndev); |
1378 | fec_stop(ndev); | 1378 | clk_disable(fep->clk); |
1379 | } | ||
1380 | } | 1379 | } |
1381 | return 0; | 1380 | return 0; |
1382 | } | 1381 | } |
@@ -1385,12 +1384,13 @@ static int | |||
1385 | fec_resume(struct platform_device *dev) | 1384 | fec_resume(struct platform_device *dev) |
1386 | { | 1385 | { |
1387 | struct net_device *ndev = platform_get_drvdata(dev); | 1386 | struct net_device *ndev = platform_get_drvdata(dev); |
1387 | struct fec_enet_private *fep; | ||
1388 | 1388 | ||
1389 | if (ndev) { | 1389 | if (ndev) { |
1390 | if (netif_running(ndev)) { | 1390 | fep = netdev_priv(ndev); |
1391 | fec_enet_init(ndev, 0); | 1391 | clk_enable(fep->clk); |
1392 | netif_device_attach(ndev); | 1392 | if (netif_running(ndev)) |
1393 | } | 1393 | fec_enet_open(ndev); |
1394 | } | 1394 | } |
1395 | return 0; | 1395 | return 0; |
1396 | } | 1396 | } |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 1830f3199cb5..46c69cd06553 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -747,8 +747,7 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev) | |||
747 | FSL_GIANFAR_DEV_HAS_CSUM | | 747 | FSL_GIANFAR_DEV_HAS_CSUM | |
748 | FSL_GIANFAR_DEV_HAS_VLAN | | 748 | FSL_GIANFAR_DEV_HAS_VLAN | |
749 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | | 749 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | |
750 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH | | 750 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH; |
751 | FSL_GIANFAR_DEV_HAS_TIMER; | ||
752 | 751 | ||
753 | ctype = of_get_property(np, "phy-connection-type", NULL); | 752 | ctype = of_get_property(np, "phy-connection-type", NULL); |
754 | 753 | ||
diff --git a/drivers/net/ixgbe/ixgbe_common.c b/drivers/net/ixgbe/ixgbe_common.c index 1159d9138f05..9595b1bfb8dd 100644 --- a/drivers/net/ixgbe/ixgbe_common.c +++ b/drivers/net/ixgbe/ixgbe_common.c | |||
@@ -1188,6 +1188,7 @@ s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq, | |||
1188 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); | 1188 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); |
1189 | } else { | 1189 | } else { |
1190 | hw_dbg(hw, "RAR index %d is out of range.\n", index); | 1190 | hw_dbg(hw, "RAR index %d is out of range.\n", index); |
1191 | return IXGBE_ERR_RAR_INDEX; | ||
1191 | } | 1192 | } |
1192 | 1193 | ||
1193 | return 0; | 1194 | return 0; |
@@ -1219,6 +1220,7 @@ s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index) | |||
1219 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); | 1220 | IXGBE_WRITE_REG(hw, IXGBE_RAH(index), rar_high); |
1220 | } else { | 1221 | } else { |
1221 | hw_dbg(hw, "RAR index %d is out of range.\n", index); | 1222 | hw_dbg(hw, "RAR index %d is out of range.\n", index); |
1223 | return IXGBE_ERR_RAR_INDEX; | ||
1222 | } | 1224 | } |
1223 | 1225 | ||
1224 | /* clear VMDq pool/queue selection for this RAR */ | 1226 | /* clear VMDq pool/queue selection for this RAR */ |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index d571d101de08..b2af2f67f604 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -642,7 +642,7 @@ static inline bool ixgbe_tx_xon_state(struct ixgbe_adapter *adapter, | |||
642 | u32 txoff = IXGBE_TFCS_TXOFF; | 642 | u32 txoff = IXGBE_TFCS_TXOFF; |
643 | 643 | ||
644 | #ifdef CONFIG_IXGBE_DCB | 644 | #ifdef CONFIG_IXGBE_DCB |
645 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | 645 | if (adapter->dcb_cfg.pfc_mode_enable) { |
646 | int tc; | 646 | int tc; |
647 | int reg_idx = tx_ring->reg_idx; | 647 | int reg_idx = tx_ring->reg_idx; |
648 | int dcb_i = adapter->ring_feature[RING_F_DCB].indices; | 648 | int dcb_i = adapter->ring_feature[RING_F_DCB].indices; |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index 2eb6e151016c..cdd1998f18c7 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
@@ -2609,6 +2609,7 @@ struct ixgbe_info { | |||
2609 | #define IXGBE_ERR_EEPROM_VERSION -24 | 2609 | #define IXGBE_ERR_EEPROM_VERSION -24 |
2610 | #define IXGBE_ERR_NO_SPACE -25 | 2610 | #define IXGBE_ERR_NO_SPACE -25 |
2611 | #define IXGBE_ERR_OVERTEMP -26 | 2611 | #define IXGBE_ERR_OVERTEMP -26 |
2612 | #define IXGBE_ERR_RAR_INDEX -27 | ||
2612 | #define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF | 2613 | #define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF |
2613 | 2614 | ||
2614 | #endif /* _IXGBE_TYPE_H_ */ | 2615 | #endif /* _IXGBE_TYPE_H_ */ |
diff --git a/drivers/net/korina.c b/drivers/net/korina.c index 26bf1b76b997..c7a9bef4dfb0 100644 --- a/drivers/net/korina.c +++ b/drivers/net/korina.c | |||
@@ -135,6 +135,7 @@ struct korina_private { | |||
135 | struct napi_struct napi; | 135 | struct napi_struct napi; |
136 | struct timer_list media_check_timer; | 136 | struct timer_list media_check_timer; |
137 | struct mii_if_info mii_if; | 137 | struct mii_if_info mii_if; |
138 | struct work_struct restart_task; | ||
138 | struct net_device *dev; | 139 | struct net_device *dev; |
139 | int phy_addr; | 140 | int phy_addr; |
140 | }; | 141 | }; |
@@ -375,7 +376,7 @@ static int korina_rx(struct net_device *dev, int limit) | |||
375 | if (devcs & ETH_RX_LE) | 376 | if (devcs & ETH_RX_LE) |
376 | dev->stats.rx_length_errors++; | 377 | dev->stats.rx_length_errors++; |
377 | if (devcs & ETH_RX_OVR) | 378 | if (devcs & ETH_RX_OVR) |
378 | dev->stats.rx_over_errors++; | 379 | dev->stats.rx_fifo_errors++; |
379 | if (devcs & ETH_RX_CV) | 380 | if (devcs & ETH_RX_CV) |
380 | dev->stats.rx_frame_errors++; | 381 | dev->stats.rx_frame_errors++; |
381 | if (devcs & ETH_RX_CES) | 382 | if (devcs & ETH_RX_CES) |
@@ -764,10 +765,9 @@ static int korina_alloc_ring(struct net_device *dev) | |||
764 | 765 | ||
765 | /* Initialize the receive descriptors */ | 766 | /* Initialize the receive descriptors */ |
766 | for (i = 0; i < KORINA_NUM_RDS; i++) { | 767 | for (i = 0; i < KORINA_NUM_RDS; i++) { |
767 | skb = dev_alloc_skb(KORINA_RBSIZE + 2); | 768 | skb = netdev_alloc_skb_ip_align(dev, KORINA_RBSIZE); |
768 | if (!skb) | 769 | if (!skb) |
769 | return -ENOMEM; | 770 | return -ENOMEM; |
770 | skb_reserve(skb, 2); | ||
771 | lp->rx_skb[i] = skb; | 771 | lp->rx_skb[i] = skb; |
772 | lp->rd_ring[i].control = DMA_DESC_IOD | | 772 | lp->rd_ring[i].control = DMA_DESC_IOD | |
773 | DMA_COUNT(KORINA_RBSIZE); | 773 | DMA_COUNT(KORINA_RBSIZE); |
@@ -890,12 +890,12 @@ static int korina_init(struct net_device *dev) | |||
890 | 890 | ||
891 | /* | 891 | /* |
892 | * Restart the RC32434 ethernet controller. | 892 | * Restart the RC32434 ethernet controller. |
893 | * FIXME: check the return status where we call it | ||
894 | */ | 893 | */ |
895 | static int korina_restart(struct net_device *dev) | 894 | static void korina_restart_task(struct work_struct *work) |
896 | { | 895 | { |
897 | struct korina_private *lp = netdev_priv(dev); | 896 | struct korina_private *lp = container_of(work, |
898 | int ret; | 897 | struct korina_private, restart_task); |
898 | struct net_device *dev = lp->dev; | ||
899 | 899 | ||
900 | /* | 900 | /* |
901 | * Disable interrupts | 901 | * Disable interrupts |
@@ -916,10 +916,9 @@ static int korina_restart(struct net_device *dev) | |||
916 | 916 | ||
917 | napi_disable(&lp->napi); | 917 | napi_disable(&lp->napi); |
918 | 918 | ||
919 | ret = korina_init(dev); | 919 | if (korina_init(dev) < 0) { |
920 | if (ret < 0) { | ||
921 | printk(KERN_ERR "%s: cannot restart device\n", dev->name); | 920 | printk(KERN_ERR "%s: cannot restart device\n", dev->name); |
922 | return ret; | 921 | return; |
923 | } | 922 | } |
924 | korina_multicast_list(dev); | 923 | korina_multicast_list(dev); |
925 | 924 | ||
@@ -927,8 +926,6 @@ static int korina_restart(struct net_device *dev) | |||
927 | enable_irq(lp->ovr_irq); | 926 | enable_irq(lp->ovr_irq); |
928 | enable_irq(lp->tx_irq); | 927 | enable_irq(lp->tx_irq); |
929 | enable_irq(lp->rx_irq); | 928 | enable_irq(lp->rx_irq); |
930 | |||
931 | return ret; | ||
932 | } | 929 | } |
933 | 930 | ||
934 | static void korina_clear_and_restart(struct net_device *dev, u32 value) | 931 | static void korina_clear_and_restart(struct net_device *dev, u32 value) |
@@ -937,7 +934,7 @@ static void korina_clear_and_restart(struct net_device *dev, u32 value) | |||
937 | 934 | ||
938 | netif_stop_queue(dev); | 935 | netif_stop_queue(dev); |
939 | writel(value, &lp->eth_regs->ethintfc); | 936 | writel(value, &lp->eth_regs->ethintfc); |
940 | korina_restart(dev); | 937 | schedule_work(&lp->restart_task); |
941 | } | 938 | } |
942 | 939 | ||
943 | /* Ethernet Tx Underflow interrupt */ | 940 | /* Ethernet Tx Underflow interrupt */ |
@@ -962,11 +959,8 @@ static irqreturn_t korina_und_interrupt(int irq, void *dev_id) | |||
962 | static void korina_tx_timeout(struct net_device *dev) | 959 | static void korina_tx_timeout(struct net_device *dev) |
963 | { | 960 | { |
964 | struct korina_private *lp = netdev_priv(dev); | 961 | struct korina_private *lp = netdev_priv(dev); |
965 | unsigned long flags; | ||
966 | 962 | ||
967 | spin_lock_irqsave(&lp->lock, flags); | 963 | schedule_work(&lp->restart_task); |
968 | korina_restart(dev); | ||
969 | spin_unlock_irqrestore(&lp->lock, flags); | ||
970 | } | 964 | } |
971 | 965 | ||
972 | /* Ethernet Rx Overflow interrupt */ | 966 | /* Ethernet Rx Overflow interrupt */ |
@@ -1086,6 +1080,8 @@ static int korina_close(struct net_device *dev) | |||
1086 | 1080 | ||
1087 | napi_disable(&lp->napi); | 1081 | napi_disable(&lp->napi); |
1088 | 1082 | ||
1083 | cancel_work_sync(&lp->restart_task); | ||
1084 | |||
1089 | free_irq(lp->rx_irq, dev); | 1085 | free_irq(lp->rx_irq, dev); |
1090 | free_irq(lp->tx_irq, dev); | 1086 | free_irq(lp->tx_irq, dev); |
1091 | free_irq(lp->ovr_irq, dev); | 1087 | free_irq(lp->ovr_irq, dev); |
@@ -1198,6 +1194,8 @@ static int korina_probe(struct platform_device *pdev) | |||
1198 | } | 1194 | } |
1199 | setup_timer(&lp->media_check_timer, korina_poll_media, (unsigned long) dev); | 1195 | setup_timer(&lp->media_check_timer, korina_poll_media, (unsigned long) dev); |
1200 | 1196 | ||
1197 | INIT_WORK(&lp->restart_task, korina_restart_task); | ||
1198 | |||
1201 | printk(KERN_INFO "%s: " DRV_NAME "-" DRV_VERSION " " DRV_RELDATE "\n", | 1199 | printk(KERN_INFO "%s: " DRV_NAME "-" DRV_VERSION " " DRV_RELDATE "\n", |
1202 | dev->name); | 1200 | dev->name); |
1203 | out: | 1201 | out: |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 7b6fe89f9db0..64e6a84bbbbe 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
@@ -322,6 +322,7 @@ static int smc91c92_probe(struct pcmcia_device *link) | |||
322 | return -ENOMEM; | 322 | return -ENOMEM; |
323 | smc = netdev_priv(dev); | 323 | smc = netdev_priv(dev); |
324 | smc->p_dev = link; | 324 | smc->p_dev = link; |
325 | link->priv = dev; | ||
325 | 326 | ||
326 | spin_lock_init(&smc->lock); | 327 | spin_lock_init(&smc->lock); |
327 | link->io.NumPorts1 = 16; | 328 | link->io.NumPorts1 = 16; |
diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index 8ee929b796d8..dbd003453737 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c | |||
@@ -53,6 +53,9 @@ | |||
53 | 53 | ||
54 | #define MII_LXT971_ISR 19 /* Interrupt Status Register */ | 54 | #define MII_LXT971_ISR 19 /* Interrupt Status Register */ |
55 | 55 | ||
56 | /* register definitions for the 973 */ | ||
57 | #define MII_LXT973_PCR 16 /* Port Configuration Register */ | ||
58 | #define PCR_FIBER_SELECT 1 | ||
56 | 59 | ||
57 | MODULE_DESCRIPTION("Intel LXT PHY driver"); | 60 | MODULE_DESCRIPTION("Intel LXT PHY driver"); |
58 | MODULE_AUTHOR("Andy Fleming"); | 61 | MODULE_AUTHOR("Andy Fleming"); |
@@ -119,6 +122,33 @@ static int lxt971_config_intr(struct phy_device *phydev) | |||
119 | return err; | 122 | return err; |
120 | } | 123 | } |
121 | 124 | ||
125 | static int lxt973_probe(struct phy_device *phydev) | ||
126 | { | ||
127 | int val = phy_read(phydev, MII_LXT973_PCR); | ||
128 | |||
129 | if (val & PCR_FIBER_SELECT) { | ||
130 | /* | ||
131 | * If fiber is selected, then the only correct setting | ||
132 | * is 100Mbps, full duplex, and auto negotiation off. | ||
133 | */ | ||
134 | val = phy_read(phydev, MII_BMCR); | ||
135 | val |= (BMCR_SPEED100 | BMCR_FULLDPLX); | ||
136 | val &= ~BMCR_ANENABLE; | ||
137 | phy_write(phydev, MII_BMCR, val); | ||
138 | /* Remember that the port is in fiber mode. */ | ||
139 | phydev->priv = lxt973_probe; | ||
140 | } else { | ||
141 | phydev->priv = NULL; | ||
142 | } | ||
143 | return 0; | ||
144 | } | ||
145 | |||
146 | static int lxt973_config_aneg(struct phy_device *phydev) | ||
147 | { | ||
148 | /* Do nothing if port is in fiber mode. */ | ||
149 | return phydev->priv ? 0 : genphy_config_aneg(phydev); | ||
150 | } | ||
151 | |||
122 | static struct phy_driver lxt970_driver = { | 152 | static struct phy_driver lxt970_driver = { |
123 | .phy_id = 0x78100000, | 153 | .phy_id = 0x78100000, |
124 | .name = "LXT970", | 154 | .name = "LXT970", |
@@ -146,6 +176,18 @@ static struct phy_driver lxt971_driver = { | |||
146 | .driver = { .owner = THIS_MODULE,}, | 176 | .driver = { .owner = THIS_MODULE,}, |
147 | }; | 177 | }; |
148 | 178 | ||
179 | static struct phy_driver lxt973_driver = { | ||
180 | .phy_id = 0x00137a10, | ||
181 | .name = "LXT973", | ||
182 | .phy_id_mask = 0xfffffff0, | ||
183 | .features = PHY_BASIC_FEATURES, | ||
184 | .flags = 0, | ||
185 | .probe = lxt973_probe, | ||
186 | .config_aneg = lxt973_config_aneg, | ||
187 | .read_status = genphy_read_status, | ||
188 | .driver = { .owner = THIS_MODULE,}, | ||
189 | }; | ||
190 | |||
149 | static int __init lxt_init(void) | 191 | static int __init lxt_init(void) |
150 | { | 192 | { |
151 | int ret; | 193 | int ret; |
@@ -157,9 +199,15 @@ static int __init lxt_init(void) | |||
157 | ret = phy_driver_register(&lxt971_driver); | 199 | ret = phy_driver_register(&lxt971_driver); |
158 | if (ret) | 200 | if (ret) |
159 | goto err2; | 201 | goto err2; |
202 | |||
203 | ret = phy_driver_register(&lxt973_driver); | ||
204 | if (ret) | ||
205 | goto err3; | ||
160 | return 0; | 206 | return 0; |
161 | 207 | ||
162 | err2: | 208 | err3: |
209 | phy_driver_unregister(&lxt971_driver); | ||
210 | err2: | ||
163 | phy_driver_unregister(&lxt970_driver); | 211 | phy_driver_unregister(&lxt970_driver); |
164 | err1: | 212 | err1: |
165 | return ret; | 213 | return ret; |
@@ -169,6 +217,7 @@ static void __exit lxt_exit(void) | |||
169 | { | 217 | { |
170 | phy_driver_unregister(&lxt970_driver); | 218 | phy_driver_unregister(&lxt970_driver); |
171 | phy_driver_unregister(&lxt971_driver); | 219 | phy_driver_unregister(&lxt971_driver); |
220 | phy_driver_unregister(&lxt973_driver); | ||
172 | } | 221 | } |
173 | 222 | ||
174 | module_init(lxt_init); | 223 | module_init(lxt_init); |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index c5f8eb102bf7..1b2c29150202 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
@@ -1422,7 +1422,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) | |||
1422 | flen = len; | 1422 | flen = len; |
1423 | if (nfree > 0) { | 1423 | if (nfree > 0) { |
1424 | if (pch->speed == 0) { | 1424 | if (pch->speed == 0) { |
1425 | flen = totlen/nfree; | 1425 | flen = len/nfree; |
1426 | if (nbigger > 0) { | 1426 | if (nbigger > 0) { |
1427 | flen++; | 1427 | flen++; |
1428 | nbigger--; | 1428 | nbigger--; |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 217e709bda3e..96b6cfbf0a3a 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -559,6 +559,11 @@ static void mdio_write(void __iomem *ioaddr, int reg_addr, int value) | |||
559 | break; | 559 | break; |
560 | udelay(25); | 560 | udelay(25); |
561 | } | 561 | } |
562 | /* | ||
563 | * According to hardware specs a 20us delay is required after write | ||
564 | * complete indication, but before sending next command. | ||
565 | */ | ||
566 | udelay(20); | ||
562 | } | 567 | } |
563 | 568 | ||
564 | static int mdio_read(void __iomem *ioaddr, int reg_addr) | 569 | static int mdio_read(void __iomem *ioaddr, int reg_addr) |
@@ -578,6 +583,12 @@ static int mdio_read(void __iomem *ioaddr, int reg_addr) | |||
578 | } | 583 | } |
579 | udelay(25); | 584 | udelay(25); |
580 | } | 585 | } |
586 | /* | ||
587 | * According to hardware specs a 20us delay is required after read | ||
588 | * complete indication, but before sending next command. | ||
589 | */ | ||
590 | udelay(20); | ||
591 | |||
581 | return value; | 592 | return value; |
582 | } | 593 | } |
583 | 594 | ||
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h index 2e6fd89f2a72..4762c91cb587 100644 --- a/drivers/net/sfc/net_driver.h +++ b/drivers/net/sfc/net_driver.h | |||
@@ -830,7 +830,7 @@ static inline const char *efx_dev_name(struct efx_nic *efx) | |||
830 | 830 | ||
831 | static inline unsigned int efx_port_num(struct efx_nic *efx) | 831 | static inline unsigned int efx_port_num(struct efx_nic *efx) |
832 | { | 832 | { |
833 | return PCI_FUNC(efx->pci_dev->devfn); | 833 | return efx->net_dev->dev_id; |
834 | } | 834 | } |
835 | 835 | ||
836 | /** | 836 | /** |
diff --git a/drivers/net/sfc/siena.c b/drivers/net/sfc/siena.c index 727b4228e081..f2b1e6180753 100644 --- a/drivers/net/sfc/siena.c +++ b/drivers/net/sfc/siena.c | |||
@@ -206,6 +206,7 @@ static int siena_probe_nic(struct efx_nic *efx) | |||
206 | { | 206 | { |
207 | struct siena_nic_data *nic_data; | 207 | struct siena_nic_data *nic_data; |
208 | bool already_attached = 0; | 208 | bool already_attached = 0; |
209 | efx_oword_t reg; | ||
209 | int rc; | 210 | int rc; |
210 | 211 | ||
211 | /* Allocate storage for hardware specific data */ | 212 | /* Allocate storage for hardware specific data */ |
@@ -220,6 +221,9 @@ static int siena_probe_nic(struct efx_nic *efx) | |||
220 | goto fail1; | 221 | goto fail1; |
221 | } | 222 | } |
222 | 223 | ||
224 | efx_reado(efx, ®, FR_AZ_CS_DEBUG); | ||
225 | efx->net_dev->dev_id = EFX_OWORD_FIELD(reg, FRF_CZ_CS_PORT_NUM) - 1; | ||
226 | |||
223 | efx_mcdi_init(efx); | 227 | efx_mcdi_init(efx); |
224 | 228 | ||
225 | /* Recover from a failed assertion before probing */ | 229 | /* Recover from a failed assertion before probing */ |
diff --git a/drivers/net/tehuti.c b/drivers/net/tehuti.c index 20ab16192325..737df6032bbc 100644 --- a/drivers/net/tehuti.c +++ b/drivers/net/tehuti.c | |||
@@ -646,7 +646,7 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd) | |||
646 | error = copy_from_user(data, ifr->ifr_data, sizeof(data)); | 646 | error = copy_from_user(data, ifr->ifr_data, sizeof(data)); |
647 | if (error) { | 647 | if (error) { |
648 | pr_err("cant copy from user\n"); | 648 | pr_err("cant copy from user\n"); |
649 | RET(error); | 649 | RET(-EFAULT); |
650 | } | 650 | } |
651 | DBG("%d 0x%x 0x%x\n", data[0], data[1], data[2]); | 651 | DBG("%d 0x%x 0x%x\n", data[0], data[1], data[2]); |
652 | } | 652 | } |
@@ -665,7 +665,7 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd) | |||
665 | data[2]); | 665 | data[2]); |
666 | error = copy_to_user(ifr->ifr_data, data, sizeof(data)); | 666 | error = copy_to_user(ifr->ifr_data, data, sizeof(data)); |
667 | if (error) | 667 | if (error) |
668 | RET(error); | 668 | RET(-EFAULT); |
669 | break; | 669 | break; |
670 | 670 | ||
671 | case BDX_OP_WRITE: | 671 | case BDX_OP_WRITE: |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 1f802e90474c..9516f382a6ba 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -344,7 +344,7 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
344 | return 2; | 344 | return 2; |
345 | } | 345 | } |
346 | 346 | ||
347 | if (size > ETH_FRAME_LEN) { | 347 | if (size > dev->net->mtu + ETH_HLEN) { |
348 | netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", | 348 | netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", |
349 | size); | 349 | size); |
350 | return 0; | 350 | return 0; |
diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c index 166e77dfffda..e47f5a986b1c 100644 --- a/drivers/net/wan/x25_asy.c +++ b/drivers/net/wan/x25_asy.c | |||
@@ -37,8 +37,6 @@ | |||
37 | #include <net/x25device.h> | 37 | #include <net/x25device.h> |
38 | #include "x25_asy.h" | 38 | #include "x25_asy.h" |
39 | 39 | ||
40 | #include <net/x25device.h> | ||
41 | |||
42 | static struct net_device **x25_asy_devs; | 40 | static struct net_device **x25_asy_devs; |
43 | static int x25_asy_maxdev = SL_NRUNIT; | 41 | static int x25_asy_maxdev = SL_NRUNIT; |
44 | 42 | ||
diff --git a/drivers/net/wimax/i2400m/fw.c b/drivers/net/wimax/i2400m/fw.c index 3f283bff0ff7..11491354e5b5 100644 --- a/drivers/net/wimax/i2400m/fw.c +++ b/drivers/net/wimax/i2400m/fw.c | |||
@@ -1192,7 +1192,7 @@ int i2400m_fw_hdr_check(struct i2400m *i2400m, | |||
1192 | unsigned module_type, header_len, major_version, minor_version, | 1192 | unsigned module_type, header_len, major_version, minor_version, |
1193 | module_id, module_vendor, date, size; | 1193 | module_id, module_vendor, date, size; |
1194 | 1194 | ||
1195 | module_type = bcf_hdr->module_type; | 1195 | module_type = le32_to_cpu(bcf_hdr->module_type); |
1196 | header_len = sizeof(u32) * le32_to_cpu(bcf_hdr->header_len); | 1196 | header_len = sizeof(u32) * le32_to_cpu(bcf_hdr->header_len); |
1197 | major_version = (le32_to_cpu(bcf_hdr->header_version) & 0xffff0000) | 1197 | major_version = (le32_to_cpu(bcf_hdr->header_version) & 0xffff0000) |
1198 | >> 16; | 1198 | >> 16; |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index cc6d41dec332..648972df369d 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
@@ -195,7 +195,7 @@ static const struct ieee80211_rate ath5k_rates[] = { | |||
195 | static int __devinit ath5k_pci_probe(struct pci_dev *pdev, | 195 | static int __devinit ath5k_pci_probe(struct pci_dev *pdev, |
196 | const struct pci_device_id *id); | 196 | const struct pci_device_id *id); |
197 | static void __devexit ath5k_pci_remove(struct pci_dev *pdev); | 197 | static void __devexit ath5k_pci_remove(struct pci_dev *pdev); |
198 | #ifdef CONFIG_PM | 198 | #ifdef CONFIG_PM_SLEEP |
199 | static int ath5k_pci_suspend(struct device *dev); | 199 | static int ath5k_pci_suspend(struct device *dev); |
200 | static int ath5k_pci_resume(struct device *dev); | 200 | static int ath5k_pci_resume(struct device *dev); |
201 | 201 | ||
@@ -203,7 +203,7 @@ static SIMPLE_DEV_PM_OPS(ath5k_pm_ops, ath5k_pci_suspend, ath5k_pci_resume); | |||
203 | #define ATH5K_PM_OPS (&ath5k_pm_ops) | 203 | #define ATH5K_PM_OPS (&ath5k_pm_ops) |
204 | #else | 204 | #else |
205 | #define ATH5K_PM_OPS NULL | 205 | #define ATH5K_PM_OPS NULL |
206 | #endif /* CONFIG_PM */ | 206 | #endif /* CONFIG_PM_SLEEP */ |
207 | 207 | ||
208 | static struct pci_driver ath5k_pci_driver = { | 208 | static struct pci_driver ath5k_pci_driver = { |
209 | .name = KBUILD_MODNAME, | 209 | .name = KBUILD_MODNAME, |
@@ -222,7 +222,6 @@ static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb); | |||
222 | static int ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff *skb, | 222 | static int ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff *skb, |
223 | struct ath5k_txq *txq); | 223 | struct ath5k_txq *txq); |
224 | static int ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan); | 224 | static int ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan); |
225 | static int ath5k_reset_wake(struct ath5k_softc *sc); | ||
226 | static int ath5k_start(struct ieee80211_hw *hw); | 225 | static int ath5k_start(struct ieee80211_hw *hw); |
227 | static void ath5k_stop(struct ieee80211_hw *hw); | 226 | static void ath5k_stop(struct ieee80211_hw *hw); |
228 | static int ath5k_add_interface(struct ieee80211_hw *hw, | 227 | static int ath5k_add_interface(struct ieee80211_hw *hw, |
@@ -709,7 +708,7 @@ ath5k_pci_remove(struct pci_dev *pdev) | |||
709 | ieee80211_free_hw(hw); | 708 | ieee80211_free_hw(hw); |
710 | } | 709 | } |
711 | 710 | ||
712 | #ifdef CONFIG_PM | 711 | #ifdef CONFIG_PM_SLEEP |
713 | static int ath5k_pci_suspend(struct device *dev) | 712 | static int ath5k_pci_suspend(struct device *dev) |
714 | { | 713 | { |
715 | struct ieee80211_hw *hw = pci_get_drvdata(to_pci_dev(dev)); | 714 | struct ieee80211_hw *hw = pci_get_drvdata(to_pci_dev(dev)); |
@@ -735,7 +734,7 @@ static int ath5k_pci_resume(struct device *dev) | |||
735 | ath5k_led_enable(sc); | 734 | ath5k_led_enable(sc); |
736 | return 0; | 735 | return 0; |
737 | } | 736 | } |
738 | #endif /* CONFIG_PM */ | 737 | #endif /* CONFIG_PM_SLEEP */ |
739 | 738 | ||
740 | 739 | ||
741 | /***********************\ | 740 | /***********************\ |
@@ -2770,7 +2769,7 @@ ath5k_tasklet_reset(unsigned long data) | |||
2770 | { | 2769 | { |
2771 | struct ath5k_softc *sc = (void *)data; | 2770 | struct ath5k_softc *sc = (void *)data; |
2772 | 2771 | ||
2773 | ath5k_reset_wake(sc); | 2772 | ath5k_reset(sc, sc->curchan); |
2774 | } | 2773 | } |
2775 | 2774 | ||
2776 | /* | 2775 | /* |
@@ -2941,23 +2940,13 @@ ath5k_reset(struct ath5k_softc *sc, struct ieee80211_channel *chan) | |||
2941 | ath5k_beacon_config(sc); | 2940 | ath5k_beacon_config(sc); |
2942 | /* intrs are enabled by ath5k_beacon_config */ | 2941 | /* intrs are enabled by ath5k_beacon_config */ |
2943 | 2942 | ||
2943 | ieee80211_wake_queues(sc->hw); | ||
2944 | |||
2944 | return 0; | 2945 | return 0; |
2945 | err: | 2946 | err: |
2946 | return ret; | 2947 | return ret; |
2947 | } | 2948 | } |
2948 | 2949 | ||
2949 | static int | ||
2950 | ath5k_reset_wake(struct ath5k_softc *sc) | ||
2951 | { | ||
2952 | int ret; | ||
2953 | |||
2954 | ret = ath5k_reset(sc, sc->curchan); | ||
2955 | if (!ret) | ||
2956 | ieee80211_wake_queues(sc->hw); | ||
2957 | |||
2958 | return ret; | ||
2959 | } | ||
2960 | |||
2961 | static int ath5k_start(struct ieee80211_hw *hw) | 2950 | static int ath5k_start(struct ieee80211_hw *hw) |
2962 | { | 2951 | { |
2963 | return ath5k_init(hw->priv); | 2952 | return ath5k_init(hw->priv); |
@@ -3151,13 +3140,15 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, | |||
3151 | 3140 | ||
3152 | if (changed_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS)) { | 3141 | if (changed_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS)) { |
3153 | if (*new_flags & FIF_PROMISC_IN_BSS) { | 3142 | if (*new_flags & FIF_PROMISC_IN_BSS) { |
3154 | rfilt |= AR5K_RX_FILTER_PROM; | ||
3155 | __set_bit(ATH_STAT_PROMISC, sc->status); | 3143 | __set_bit(ATH_STAT_PROMISC, sc->status); |
3156 | } else { | 3144 | } else { |
3157 | __clear_bit(ATH_STAT_PROMISC, sc->status); | 3145 | __clear_bit(ATH_STAT_PROMISC, sc->status); |
3158 | } | 3146 | } |
3159 | } | 3147 | } |
3160 | 3148 | ||
3149 | if (test_bit(ATH_STAT_PROMISC, sc->status)) | ||
3150 | rfilt |= AR5K_RX_FILTER_PROM; | ||
3151 | |||
3161 | /* Note, AR5K_RX_FILTER_MCAST is already enabled */ | 3152 | /* Note, AR5K_RX_FILTER_MCAST is already enabled */ |
3162 | if (*new_flags & FIF_ALLMULTI) { | 3153 | if (*new_flags & FIF_ALLMULTI) { |
3163 | mfilt[0] = ~0; | 3154 | mfilt[0] = ~0; |
diff --git a/drivers/net/wireless/ath/ath5k/phy.c b/drivers/net/wireless/ath/ath5k/phy.c index 1b81c4778800..492cbb15720d 100644 --- a/drivers/net/wireless/ath/ath5k/phy.c +++ b/drivers/net/wireless/ath/ath5k/phy.c | |||
@@ -1814,6 +1814,13 @@ ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode) | |||
1814 | u8 def_ant, tx_ant, ee_mode; | 1814 | u8 def_ant, tx_ant, ee_mode; |
1815 | u32 sta_id1 = 0; | 1815 | u32 sta_id1 = 0; |
1816 | 1816 | ||
1817 | /* if channel is not initialized yet we can't set the antennas | ||
1818 | * so just store the mode. it will be set on the next reset */ | ||
1819 | if (channel == NULL) { | ||
1820 | ah->ah_ant_mode = ant_mode; | ||
1821 | return; | ||
1822 | } | ||
1823 | |||
1817 | def_ant = ah->ah_def_ant; | 1824 | def_ant = ah->ah_def_ant; |
1818 | 1825 | ||
1819 | ATH5K_TRACE(ah->ah_sc); | 1826 | ATH5K_TRACE(ah->ah_sc); |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index d70732819423..ff9b5c882184 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
@@ -2618,15 +2618,6 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id) | |||
2618 | int events = 0; | 2618 | int events = 0; |
2619 | u16 ev; | 2619 | u16 ev; |
2620 | 2620 | ||
2621 | /* Detect early interrupt before driver is fully configued */ | ||
2622 | if (!dev->base_addr) { | ||
2623 | if (net_ratelimit()) { | ||
2624 | printk(KERN_DEBUG "%s: Interrupt, but dev not configured\n", | ||
2625 | dev->name); | ||
2626 | } | ||
2627 | return IRQ_HANDLED; | ||
2628 | } | ||
2629 | |||
2630 | iface = netdev_priv(dev); | 2621 | iface = netdev_priv(dev); |
2631 | local = iface->local; | 2622 | local = iface->local; |
2632 | 2623 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 068f7f8435c5..c44a303e62ed 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -2852,6 +2852,7 @@ static struct iwl_lib_ops iwl3945_lib = { | |||
2852 | .isr = iwl_isr_legacy, | 2852 | .isr = iwl_isr_legacy, |
2853 | .config_ap = iwl3945_config_ap, | 2853 | .config_ap = iwl3945_config_ap, |
2854 | .manage_ibss_station = iwl3945_manage_ibss_station, | 2854 | .manage_ibss_station = iwl3945_manage_ibss_station, |
2855 | .recover_from_tx_stall = iwl_bg_monitor_recover, | ||
2855 | .check_plcp_health = iwl3945_good_plcp_health, | 2856 | .check_plcp_health = iwl3945_good_plcp_health, |
2856 | 2857 | ||
2857 | .debugfs_ops = { | 2858 | .debugfs_ops = { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index 1004cfc403b1..0f292a210ed9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
@@ -1119,10 +1119,9 @@ static int iwl_get_single_channel_for_scan(struct iwl_priv *priv, | |||
1119 | struct iwl_scan_channel *scan_ch) | 1119 | struct iwl_scan_channel *scan_ch) |
1120 | { | 1120 | { |
1121 | const struct ieee80211_supported_band *sband; | 1121 | const struct ieee80211_supported_band *sband; |
1122 | const struct iwl_channel_info *ch_info; | ||
1123 | u16 passive_dwell = 0; | 1122 | u16 passive_dwell = 0; |
1124 | u16 active_dwell = 0; | 1123 | u16 active_dwell = 0; |
1125 | int i, added = 0; | 1124 | int added = 0; |
1126 | u16 channel = 0; | 1125 | u16 channel = 0; |
1127 | 1126 | ||
1128 | sband = iwl_get_hw_mode(priv, band); | 1127 | sband = iwl_get_hw_mode(priv, band); |
@@ -1137,32 +1136,7 @@ static int iwl_get_single_channel_for_scan(struct iwl_priv *priv, | |||
1137 | if (passive_dwell <= active_dwell) | 1136 | if (passive_dwell <= active_dwell) |
1138 | passive_dwell = active_dwell + 1; | 1137 | passive_dwell = active_dwell + 1; |
1139 | 1138 | ||
1140 | /* only scan single channel, good enough to reset the RF */ | 1139 | channel = iwl_get_single_channel_number(priv, band); |
1141 | /* pick the first valid not in-use channel */ | ||
1142 | if (band == IEEE80211_BAND_5GHZ) { | ||
1143 | for (i = 14; i < priv->channel_count; i++) { | ||
1144 | if (priv->channel_info[i].channel != | ||
1145 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
1146 | channel = priv->channel_info[i].channel; | ||
1147 | ch_info = iwl_get_channel_info(priv, | ||
1148 | band, channel); | ||
1149 | if (is_channel_valid(ch_info)) | ||
1150 | break; | ||
1151 | } | ||
1152 | } | ||
1153 | } else { | ||
1154 | for (i = 0; i < 14; i++) { | ||
1155 | if (priv->channel_info[i].channel != | ||
1156 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
1157 | channel = | ||
1158 | priv->channel_info[i].channel; | ||
1159 | ch_info = iwl_get_channel_info(priv, | ||
1160 | band, channel); | ||
1161 | if (is_channel_valid(ch_info)) | ||
1162 | break; | ||
1163 | } | ||
1164 | } | ||
1165 | } | ||
1166 | if (channel) { | 1140 | if (channel) { |
1167 | scan_ch->channel = cpu_to_le16(channel); | 1141 | scan_ch->channel = cpu_to_le16(channel); |
1168 | scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE; | 1142 | scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c index c402bfc83f36..a732f1094e5d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c | |||
@@ -1125,6 +1125,7 @@ static void iwlagn_tx_status(struct iwl_priv *priv, struct sk_buff *skb) | |||
1125 | struct ieee80211_sta *sta; | 1125 | struct ieee80211_sta *sta; |
1126 | struct iwl_station_priv *sta_priv; | 1126 | struct iwl_station_priv *sta_priv; |
1127 | 1127 | ||
1128 | rcu_read_lock(); | ||
1128 | sta = ieee80211_find_sta(priv->vif, hdr->addr1); | 1129 | sta = ieee80211_find_sta(priv->vif, hdr->addr1); |
1129 | if (sta) { | 1130 | if (sta) { |
1130 | sta_priv = (void *)sta->drv_priv; | 1131 | sta_priv = (void *)sta->drv_priv; |
@@ -1133,6 +1134,7 @@ static void iwlagn_tx_status(struct iwl_priv *priv, struct sk_buff *skb) | |||
1133 | atomic_dec_return(&sta_priv->pending_frames) == 0) | 1134 | atomic_dec_return(&sta_priv->pending_frames) == 0) |
1134 | ieee80211_sta_block_awake(priv->hw, sta, false); | 1135 | ieee80211_sta_block_awake(priv->hw, sta, false); |
1135 | } | 1136 | } |
1137 | rcu_read_unlock(); | ||
1136 | 1138 | ||
1137 | ieee80211_tx_status_irqsafe(priv->hw, skb); | 1139 | ieee80211_tx_status_irqsafe(priv->hw, skb); |
1138 | } | 1140 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index aef4f71f1981..7726e67044c0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -1484,6 +1484,156 @@ bool iwl_good_ack_health(struct iwl_priv *priv, | |||
1484 | } | 1484 | } |
1485 | 1485 | ||
1486 | 1486 | ||
1487 | /***************************************************************************** | ||
1488 | * | ||
1489 | * sysfs attributes | ||
1490 | * | ||
1491 | *****************************************************************************/ | ||
1492 | |||
1493 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
1494 | |||
1495 | /* | ||
1496 | * The following adds a new attribute to the sysfs representation | ||
1497 | * of this device driver (i.e. a new file in /sys/class/net/wlan0/device/) | ||
1498 | * used for controlling the debug level. | ||
1499 | * | ||
1500 | * See the level definitions in iwl for details. | ||
1501 | * | ||
1502 | * The debug_level being managed using sysfs below is a per device debug | ||
1503 | * level that is used instead of the global debug level if it (the per | ||
1504 | * device debug level) is set. | ||
1505 | */ | ||
1506 | static ssize_t show_debug_level(struct device *d, | ||
1507 | struct device_attribute *attr, char *buf) | ||
1508 | { | ||
1509 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1510 | return sprintf(buf, "0x%08X\n", iwl_get_debug_level(priv)); | ||
1511 | } | ||
1512 | static ssize_t store_debug_level(struct device *d, | ||
1513 | struct device_attribute *attr, | ||
1514 | const char *buf, size_t count) | ||
1515 | { | ||
1516 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1517 | unsigned long val; | ||
1518 | int ret; | ||
1519 | |||
1520 | ret = strict_strtoul(buf, 0, &val); | ||
1521 | if (ret) | ||
1522 | IWL_ERR(priv, "%s is not in hex or decimal form.\n", buf); | ||
1523 | else { | ||
1524 | priv->debug_level = val; | ||
1525 | if (iwl_alloc_traffic_mem(priv)) | ||
1526 | IWL_ERR(priv, | ||
1527 | "Not enough memory to generate traffic log\n"); | ||
1528 | } | ||
1529 | return strnlen(buf, count); | ||
1530 | } | ||
1531 | |||
1532 | static DEVICE_ATTR(debug_level, S_IWUSR | S_IRUGO, | ||
1533 | show_debug_level, store_debug_level); | ||
1534 | |||
1535 | |||
1536 | #endif /* CONFIG_IWLWIFI_DEBUG */ | ||
1537 | |||
1538 | |||
1539 | static ssize_t show_temperature(struct device *d, | ||
1540 | struct device_attribute *attr, char *buf) | ||
1541 | { | ||
1542 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1543 | |||
1544 | if (!iwl_is_alive(priv)) | ||
1545 | return -EAGAIN; | ||
1546 | |||
1547 | return sprintf(buf, "%d\n", priv->temperature); | ||
1548 | } | ||
1549 | |||
1550 | static DEVICE_ATTR(temperature, S_IRUGO, show_temperature, NULL); | ||
1551 | |||
1552 | static ssize_t show_tx_power(struct device *d, | ||
1553 | struct device_attribute *attr, char *buf) | ||
1554 | { | ||
1555 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1556 | |||
1557 | if (!iwl_is_ready_rf(priv)) | ||
1558 | return sprintf(buf, "off\n"); | ||
1559 | else | ||
1560 | return sprintf(buf, "%d\n", priv->tx_power_user_lmt); | ||
1561 | } | ||
1562 | |||
1563 | static ssize_t store_tx_power(struct device *d, | ||
1564 | struct device_attribute *attr, | ||
1565 | const char *buf, size_t count) | ||
1566 | { | ||
1567 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1568 | unsigned long val; | ||
1569 | int ret; | ||
1570 | |||
1571 | ret = strict_strtoul(buf, 10, &val); | ||
1572 | if (ret) | ||
1573 | IWL_INFO(priv, "%s is not in decimal form.\n", buf); | ||
1574 | else { | ||
1575 | ret = iwl_set_tx_power(priv, val, false); | ||
1576 | if (ret) | ||
1577 | IWL_ERR(priv, "failed setting tx power (0x%d).\n", | ||
1578 | ret); | ||
1579 | else | ||
1580 | ret = count; | ||
1581 | } | ||
1582 | return ret; | ||
1583 | } | ||
1584 | |||
1585 | static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); | ||
1586 | |||
1587 | static ssize_t show_rts_ht_protection(struct device *d, | ||
1588 | struct device_attribute *attr, char *buf) | ||
1589 | { | ||
1590 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1591 | |||
1592 | return sprintf(buf, "%s\n", | ||
1593 | priv->cfg->use_rts_for_ht ? "RTS/CTS" : "CTS-to-self"); | ||
1594 | } | ||
1595 | |||
1596 | static ssize_t store_rts_ht_protection(struct device *d, | ||
1597 | struct device_attribute *attr, | ||
1598 | const char *buf, size_t count) | ||
1599 | { | ||
1600 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
1601 | unsigned long val; | ||
1602 | int ret; | ||
1603 | |||
1604 | ret = strict_strtoul(buf, 10, &val); | ||
1605 | if (ret) | ||
1606 | IWL_INFO(priv, "Input is not in decimal form.\n"); | ||
1607 | else { | ||
1608 | if (!iwl_is_associated(priv)) | ||
1609 | priv->cfg->use_rts_for_ht = val ? true : false; | ||
1610 | else | ||
1611 | IWL_ERR(priv, "Sta associated with AP - " | ||
1612 | "Change protection mechanism is not allowed\n"); | ||
1613 | ret = count; | ||
1614 | } | ||
1615 | return ret; | ||
1616 | } | ||
1617 | |||
1618 | static DEVICE_ATTR(rts_ht_protection, S_IWUSR | S_IRUGO, | ||
1619 | show_rts_ht_protection, store_rts_ht_protection); | ||
1620 | |||
1621 | |||
1622 | static struct attribute *iwl_sysfs_entries[] = { | ||
1623 | &dev_attr_temperature.attr, | ||
1624 | &dev_attr_tx_power.attr, | ||
1625 | &dev_attr_rts_ht_protection.attr, | ||
1626 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
1627 | &dev_attr_debug_level.attr, | ||
1628 | #endif | ||
1629 | NULL | ||
1630 | }; | ||
1631 | |||
1632 | static struct attribute_group iwl_attribute_group = { | ||
1633 | .name = NULL, /* put in device directory */ | ||
1634 | .attrs = iwl_sysfs_entries, | ||
1635 | }; | ||
1636 | |||
1487 | /****************************************************************************** | 1637 | /****************************************************************************** |
1488 | * | 1638 | * |
1489 | * uCode download functions | 1639 | * uCode download functions |
@@ -1965,6 +2115,13 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) | |||
1965 | if (err) | 2115 | if (err) |
1966 | IWL_ERR(priv, "failed to create debugfs files. Ignoring error: %d\n", err); | 2116 | IWL_ERR(priv, "failed to create debugfs files. Ignoring error: %d\n", err); |
1967 | 2117 | ||
2118 | err = sysfs_create_group(&priv->pci_dev->dev.kobj, | ||
2119 | &iwl_attribute_group); | ||
2120 | if (err) { | ||
2121 | IWL_ERR(priv, "failed to create sysfs device attributes\n"); | ||
2122 | goto out_unbind; | ||
2123 | } | ||
2124 | |||
1968 | /* We have our copies now, allow OS release its copies */ | 2125 | /* We have our copies now, allow OS release its copies */ |
1969 | release_firmware(ucode_raw); | 2126 | release_firmware(ucode_raw); |
1970 | complete(&priv->_agn.firmware_loading_complete); | 2127 | complete(&priv->_agn.firmware_loading_complete); |
@@ -3264,141 +3421,6 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
3264 | 3421 | ||
3265 | /***************************************************************************** | 3422 | /***************************************************************************** |
3266 | * | 3423 | * |
3267 | * sysfs attributes | ||
3268 | * | ||
3269 | *****************************************************************************/ | ||
3270 | |||
3271 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
3272 | |||
3273 | /* | ||
3274 | * The following adds a new attribute to the sysfs representation | ||
3275 | * of this device driver (i.e. a new file in /sys/class/net/wlan0/device/) | ||
3276 | * used for controlling the debug level. | ||
3277 | * | ||
3278 | * See the level definitions in iwl for details. | ||
3279 | * | ||
3280 | * The debug_level being managed using sysfs below is a per device debug | ||
3281 | * level that is used instead of the global debug level if it (the per | ||
3282 | * device debug level) is set. | ||
3283 | */ | ||
3284 | static ssize_t show_debug_level(struct device *d, | ||
3285 | struct device_attribute *attr, char *buf) | ||
3286 | { | ||
3287 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3288 | return sprintf(buf, "0x%08X\n", iwl_get_debug_level(priv)); | ||
3289 | } | ||
3290 | static ssize_t store_debug_level(struct device *d, | ||
3291 | struct device_attribute *attr, | ||
3292 | const char *buf, size_t count) | ||
3293 | { | ||
3294 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3295 | unsigned long val; | ||
3296 | int ret; | ||
3297 | |||
3298 | ret = strict_strtoul(buf, 0, &val); | ||
3299 | if (ret) | ||
3300 | IWL_ERR(priv, "%s is not in hex or decimal form.\n", buf); | ||
3301 | else { | ||
3302 | priv->debug_level = val; | ||
3303 | if (iwl_alloc_traffic_mem(priv)) | ||
3304 | IWL_ERR(priv, | ||
3305 | "Not enough memory to generate traffic log\n"); | ||
3306 | } | ||
3307 | return strnlen(buf, count); | ||
3308 | } | ||
3309 | |||
3310 | static DEVICE_ATTR(debug_level, S_IWUSR | S_IRUGO, | ||
3311 | show_debug_level, store_debug_level); | ||
3312 | |||
3313 | |||
3314 | #endif /* CONFIG_IWLWIFI_DEBUG */ | ||
3315 | |||
3316 | |||
3317 | static ssize_t show_temperature(struct device *d, | ||
3318 | struct device_attribute *attr, char *buf) | ||
3319 | { | ||
3320 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3321 | |||
3322 | if (!iwl_is_alive(priv)) | ||
3323 | return -EAGAIN; | ||
3324 | |||
3325 | return sprintf(buf, "%d\n", priv->temperature); | ||
3326 | } | ||
3327 | |||
3328 | static DEVICE_ATTR(temperature, S_IRUGO, show_temperature, NULL); | ||
3329 | |||
3330 | static ssize_t show_tx_power(struct device *d, | ||
3331 | struct device_attribute *attr, char *buf) | ||
3332 | { | ||
3333 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3334 | |||
3335 | if (!iwl_is_ready_rf(priv)) | ||
3336 | return sprintf(buf, "off\n"); | ||
3337 | else | ||
3338 | return sprintf(buf, "%d\n", priv->tx_power_user_lmt); | ||
3339 | } | ||
3340 | |||
3341 | static ssize_t store_tx_power(struct device *d, | ||
3342 | struct device_attribute *attr, | ||
3343 | const char *buf, size_t count) | ||
3344 | { | ||
3345 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3346 | unsigned long val; | ||
3347 | int ret; | ||
3348 | |||
3349 | ret = strict_strtoul(buf, 10, &val); | ||
3350 | if (ret) | ||
3351 | IWL_INFO(priv, "%s is not in decimal form.\n", buf); | ||
3352 | else { | ||
3353 | ret = iwl_set_tx_power(priv, val, false); | ||
3354 | if (ret) | ||
3355 | IWL_ERR(priv, "failed setting tx power (0x%d).\n", | ||
3356 | ret); | ||
3357 | else | ||
3358 | ret = count; | ||
3359 | } | ||
3360 | return ret; | ||
3361 | } | ||
3362 | |||
3363 | static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); | ||
3364 | |||
3365 | static ssize_t show_rts_ht_protection(struct device *d, | ||
3366 | struct device_attribute *attr, char *buf) | ||
3367 | { | ||
3368 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3369 | |||
3370 | return sprintf(buf, "%s\n", | ||
3371 | priv->cfg->use_rts_for_ht ? "RTS/CTS" : "CTS-to-self"); | ||
3372 | } | ||
3373 | |||
3374 | static ssize_t store_rts_ht_protection(struct device *d, | ||
3375 | struct device_attribute *attr, | ||
3376 | const char *buf, size_t count) | ||
3377 | { | ||
3378 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3379 | unsigned long val; | ||
3380 | int ret; | ||
3381 | |||
3382 | ret = strict_strtoul(buf, 10, &val); | ||
3383 | if (ret) | ||
3384 | IWL_INFO(priv, "Input is not in decimal form.\n"); | ||
3385 | else { | ||
3386 | if (!iwl_is_associated(priv)) | ||
3387 | priv->cfg->use_rts_for_ht = val ? true : false; | ||
3388 | else | ||
3389 | IWL_ERR(priv, "Sta associated with AP - " | ||
3390 | "Change protection mechanism is not allowed\n"); | ||
3391 | ret = count; | ||
3392 | } | ||
3393 | return ret; | ||
3394 | } | ||
3395 | |||
3396 | static DEVICE_ATTR(rts_ht_protection, S_IWUSR | S_IRUGO, | ||
3397 | show_rts_ht_protection, store_rts_ht_protection); | ||
3398 | |||
3399 | |||
3400 | /***************************************************************************** | ||
3401 | * | ||
3402 | * driver setup and teardown | 3424 | * driver setup and teardown |
3403 | * | 3425 | * |
3404 | *****************************************************************************/ | 3426 | *****************************************************************************/ |
@@ -3550,21 +3572,6 @@ static void iwl_uninit_drv(struct iwl_priv *priv) | |||
3550 | kfree(priv->scan_cmd); | 3572 | kfree(priv->scan_cmd); |
3551 | } | 3573 | } |
3552 | 3574 | ||
3553 | static struct attribute *iwl_sysfs_entries[] = { | ||
3554 | &dev_attr_temperature.attr, | ||
3555 | &dev_attr_tx_power.attr, | ||
3556 | &dev_attr_rts_ht_protection.attr, | ||
3557 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
3558 | &dev_attr_debug_level.attr, | ||
3559 | #endif | ||
3560 | NULL | ||
3561 | }; | ||
3562 | |||
3563 | static struct attribute_group iwl_attribute_group = { | ||
3564 | .name = NULL, /* put in device directory */ | ||
3565 | .attrs = iwl_sysfs_entries, | ||
3566 | }; | ||
3567 | |||
3568 | static struct ieee80211_ops iwl_hw_ops = { | 3575 | static struct ieee80211_ops iwl_hw_ops = { |
3569 | .tx = iwl_mac_tx, | 3576 | .tx = iwl_mac_tx, |
3570 | .start = iwl_mac_start, | 3577 | .start = iwl_mac_start, |
@@ -3750,11 +3757,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3750 | IWL_ERR(priv, "Error allocating IRQ %d\n", priv->pci_dev->irq); | 3757 | IWL_ERR(priv, "Error allocating IRQ %d\n", priv->pci_dev->irq); |
3751 | goto out_disable_msi; | 3758 | goto out_disable_msi; |
3752 | } | 3759 | } |
3753 | err = sysfs_create_group(&pdev->dev.kobj, &iwl_attribute_group); | ||
3754 | if (err) { | ||
3755 | IWL_ERR(priv, "failed to create sysfs device attributes\n"); | ||
3756 | goto out_free_irq; | ||
3757 | } | ||
3758 | 3760 | ||
3759 | iwl_setup_deferred_work(priv); | 3761 | iwl_setup_deferred_work(priv); |
3760 | iwl_setup_rx_handlers(priv); | 3762 | iwl_setup_rx_handlers(priv); |
@@ -3788,15 +3790,13 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3788 | 3790 | ||
3789 | err = iwl_request_firmware(priv, true); | 3791 | err = iwl_request_firmware(priv, true); |
3790 | if (err) | 3792 | if (err) |
3791 | goto out_remove_sysfs; | 3793 | goto out_destroy_workqueue; |
3792 | 3794 | ||
3793 | return 0; | 3795 | return 0; |
3794 | 3796 | ||
3795 | out_remove_sysfs: | 3797 | out_destroy_workqueue: |
3796 | destroy_workqueue(priv->workqueue); | 3798 | destroy_workqueue(priv->workqueue); |
3797 | priv->workqueue = NULL; | 3799 | priv->workqueue = NULL; |
3798 | sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group); | ||
3799 | out_free_irq: | ||
3800 | free_irq(priv->pci_dev->irq, priv); | 3800 | free_irq(priv->pci_dev->irq, priv); |
3801 | iwl_free_isr_ict(priv); | 3801 | iwl_free_isr_ict(priv); |
3802 | out_disable_msi: | 3802 | out_disable_msi: |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 5a7eca8fb789..426e95567de3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -854,6 +854,45 @@ void iwl_set_rxon_chain(struct iwl_priv *priv) | |||
854 | } | 854 | } |
855 | EXPORT_SYMBOL(iwl_set_rxon_chain); | 855 | EXPORT_SYMBOL(iwl_set_rxon_chain); |
856 | 856 | ||
857 | /* Return valid channel */ | ||
858 | u8 iwl_get_single_channel_number(struct iwl_priv *priv, | ||
859 | enum ieee80211_band band) | ||
860 | { | ||
861 | const struct iwl_channel_info *ch_info; | ||
862 | int i; | ||
863 | u8 channel = 0; | ||
864 | |||
865 | /* only scan single channel, good enough to reset the RF */ | ||
866 | /* pick the first valid not in-use channel */ | ||
867 | if (band == IEEE80211_BAND_5GHZ) { | ||
868 | for (i = 14; i < priv->channel_count; i++) { | ||
869 | if (priv->channel_info[i].channel != | ||
870 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
871 | channel = priv->channel_info[i].channel; | ||
872 | ch_info = iwl_get_channel_info(priv, | ||
873 | band, channel); | ||
874 | if (is_channel_valid(ch_info)) | ||
875 | break; | ||
876 | } | ||
877 | } | ||
878 | } else { | ||
879 | for (i = 0; i < 14; i++) { | ||
880 | if (priv->channel_info[i].channel != | ||
881 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
882 | channel = | ||
883 | priv->channel_info[i].channel; | ||
884 | ch_info = iwl_get_channel_info(priv, | ||
885 | band, channel); | ||
886 | if (is_channel_valid(ch_info)) | ||
887 | break; | ||
888 | } | ||
889 | } | ||
890 | } | ||
891 | |||
892 | return channel; | ||
893 | } | ||
894 | EXPORT_SYMBOL(iwl_get_single_channel_number); | ||
895 | |||
857 | /** | 896 | /** |
858 | * iwl_set_rxon_channel - Set the phymode and channel values in staging RXON | 897 | * iwl_set_rxon_channel - Set the phymode and channel values in staging RXON |
859 | * @phymode: MODE_IEEE80211A sets to 5.2GHz; all else set to 2.4GHz | 898 | * @phymode: MODE_IEEE80211A sets to 5.2GHz; all else set to 2.4GHz |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 7e5a5ba41fd2..31775bd9c361 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -343,6 +343,8 @@ int iwl_check_rxon_cmd(struct iwl_priv *priv); | |||
343 | int iwl_full_rxon_required(struct iwl_priv *priv); | 343 | int iwl_full_rxon_required(struct iwl_priv *priv); |
344 | void iwl_set_rxon_chain(struct iwl_priv *priv); | 344 | void iwl_set_rxon_chain(struct iwl_priv *priv); |
345 | int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch); | 345 | int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch); |
346 | u8 iwl_get_single_channel_number(struct iwl_priv *priv, | ||
347 | enum ieee80211_band band); | ||
346 | void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_config *ht_conf); | 348 | void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_config *ht_conf); |
347 | u8 iwl_is_ht40_tx_allowed(struct iwl_priv *priv, | 349 | u8 iwl_is_ht40_tx_allowed(struct iwl_priv *priv, |
348 | struct ieee80211_sta_ht_cap *sta_ht_inf); | 350 | struct ieee80211_sta_ht_cap *sta_ht_inf); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 3e5bffb6034f..6c353cacc8d6 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -1844,6 +1844,49 @@ static void iwl3945_irq_tasklet(struct iwl_priv *priv) | |||
1844 | #endif | 1844 | #endif |
1845 | } | 1845 | } |
1846 | 1846 | ||
1847 | static int iwl3945_get_single_channel_for_scan(struct iwl_priv *priv, | ||
1848 | struct ieee80211_vif *vif, | ||
1849 | enum ieee80211_band band, | ||
1850 | struct iwl3945_scan_channel *scan_ch) | ||
1851 | { | ||
1852 | const struct ieee80211_supported_band *sband; | ||
1853 | u16 passive_dwell = 0; | ||
1854 | u16 active_dwell = 0; | ||
1855 | int added = 0; | ||
1856 | u8 channel = 0; | ||
1857 | |||
1858 | sband = iwl_get_hw_mode(priv, band); | ||
1859 | if (!sband) { | ||
1860 | IWL_ERR(priv, "invalid band\n"); | ||
1861 | return added; | ||
1862 | } | ||
1863 | |||
1864 | active_dwell = iwl_get_active_dwell_time(priv, band, 0); | ||
1865 | passive_dwell = iwl_get_passive_dwell_time(priv, band, vif); | ||
1866 | |||
1867 | if (passive_dwell <= active_dwell) | ||
1868 | passive_dwell = active_dwell + 1; | ||
1869 | |||
1870 | |||
1871 | channel = iwl_get_single_channel_number(priv, band); | ||
1872 | |||
1873 | if (channel) { | ||
1874 | scan_ch->channel = channel; | ||
1875 | scan_ch->type = 0; /* passive */ | ||
1876 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | ||
1877 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); | ||
1878 | /* Set txpower levels to defaults */ | ||
1879 | scan_ch->tpc.dsp_atten = 110; | ||
1880 | if (band == IEEE80211_BAND_5GHZ) | ||
1881 | scan_ch->tpc.tx_gain = ((1 << 5) | (3 << 3)) | 3; | ||
1882 | else | ||
1883 | scan_ch->tpc.tx_gain = ((1 << 5) | (5 << 3)); | ||
1884 | added++; | ||
1885 | } else | ||
1886 | IWL_ERR(priv, "no valid channel found\n"); | ||
1887 | return added; | ||
1888 | } | ||
1889 | |||
1847 | static int iwl3945_get_channels_for_scan(struct iwl_priv *priv, | 1890 | static int iwl3945_get_channels_for_scan(struct iwl_priv *priv, |
1848 | enum ieee80211_band band, | 1891 | enum ieee80211_band band, |
1849 | u8 is_active, u8 n_probes, | 1892 | u8 is_active, u8 n_probes, |
@@ -2992,9 +3035,16 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
2992 | /* select Rx antennas */ | 3035 | /* select Rx antennas */ |
2993 | scan->flags |= iwl3945_get_antenna_flags(priv); | 3036 | scan->flags |= iwl3945_get_antenna_flags(priv); |
2994 | 3037 | ||
2995 | scan->channel_count = | 3038 | if (priv->is_internal_short_scan) { |
2996 | iwl3945_get_channels_for_scan(priv, band, is_active, n_probes, | 3039 | scan->channel_count = |
2997 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)], vif); | 3040 | iwl3945_get_single_channel_for_scan(priv, vif, band, |
3041 | (void *)&scan->data[le16_to_cpu( | ||
3042 | scan->tx_cmd.len)]); | ||
3043 | } else { | ||
3044 | scan->channel_count = | ||
3045 | iwl3945_get_channels_for_scan(priv, band, is_active, n_probes, | ||
3046 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)], vif); | ||
3047 | } | ||
2998 | 3048 | ||
2999 | if (scan->channel_count == 0) { | 3049 | if (scan->channel_count == 0) { |
3000 | IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count); | 3050 | IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count); |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index d5b197b4d5bb..73073259f508 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
@@ -80,6 +80,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { | |||
80 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ | 80 | {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ |
81 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ | 81 | {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ |
82 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ | 82 | {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ |
83 | {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */ | ||
83 | {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */ | 84 | {USB_DEVICE(0x413c, 0x8102)}, /* Spinnaker DUT */ |
84 | {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */ | 85 | {USB_DEVICE(0x413c, 0x8104)}, /* Cohiba Proto board */ |
85 | {} | 86 | {} |
diff --git a/drivers/net/wireless/wl12xx/wl1251_sdio.c b/drivers/net/wireless/wl12xx/wl1251_sdio.c index d234285c2c81..c561332e7009 100644 --- a/drivers/net/wireless/wl12xx/wl1251_sdio.c +++ b/drivers/net/wireless/wl12xx/wl1251_sdio.c | |||
@@ -259,6 +259,7 @@ disable: | |||
259 | sdio_disable_func(func); | 259 | sdio_disable_func(func); |
260 | release: | 260 | release: |
261 | sdio_release_host(func); | 261 | sdio_release_host(func); |
262 | wl1251_free_hw(wl); | ||
262 | return ret; | 263 | return ret; |
263 | } | 264 | } |
264 | 265 | ||