diff options
31 files changed, 256 insertions, 205 deletions
diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index bde3c88b8b27..b054494df846 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c | |||
| @@ -1020,12 +1020,12 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data) | |||
| 1020 | if (cmd == AVMB1_ADDCARD) { | 1020 | if (cmd == AVMB1_ADDCARD) { |
| 1021 | if ((retval = copy_from_user(&cdef, data, | 1021 | if ((retval = copy_from_user(&cdef, data, |
| 1022 | sizeof(avmb1_carddef)))) | 1022 | sizeof(avmb1_carddef)))) |
| 1023 | return retval; | 1023 | return -EFAULT; |
| 1024 | cdef.cardtype = AVM_CARDTYPE_B1; | 1024 | cdef.cardtype = AVM_CARDTYPE_B1; |
| 1025 | } else { | 1025 | } else { |
| 1026 | if ((retval = copy_from_user(&cdef, data, | 1026 | if ((retval = copy_from_user(&cdef, data, |
| 1027 | sizeof(avmb1_extcarddef)))) | 1027 | sizeof(avmb1_extcarddef)))) |
| 1028 | return retval; | 1028 | return -EFAULT; |
| 1029 | } | 1029 | } |
| 1030 | cparams.port = cdef.port; | 1030 | cparams.port = cdef.port; |
| 1031 | cparams.irq = cdef.irq; | 1031 | cparams.irq = cdef.irq; |
| @@ -1218,7 +1218,7 @@ int capi20_manufacturer(unsigned int cmd, void __user *data) | |||
| 1218 | kcapi_carddef cdef; | 1218 | kcapi_carddef cdef; |
| 1219 | 1219 | ||
| 1220 | if ((retval = copy_from_user(&cdef, data, sizeof(cdef)))) | 1220 | if ((retval = copy_from_user(&cdef, data, sizeof(cdef)))) |
| 1221 | return retval; | 1221 | return -EFAULT; |
| 1222 | 1222 | ||
| 1223 | cparams.port = cdef.port; | 1223 | cparams.port = cdef.port; |
| 1224 | cparams.irq = cdef.irq; | 1224 | cparams.irq = cdef.irq; |
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/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/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/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/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/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index cc6d41dec332..2978359c4366 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
| @@ -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, |
| @@ -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); |
diff --git a/include/net/dst.h b/include/net/dst.h index 612069beda73..81d1413a8701 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
| @@ -250,11 +250,11 @@ static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev) | |||
| 250 | * Linux networking. Thus, destinations are stackable. | 250 | * Linux networking. Thus, destinations are stackable. |
| 251 | */ | 251 | */ |
| 252 | 252 | ||
| 253 | static inline struct dst_entry *dst_pop(struct dst_entry *dst) | 253 | static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb) |
| 254 | { | 254 | { |
| 255 | struct dst_entry *child = dst_clone(dst->child); | 255 | struct dst_entry *child = skb_dst(skb)->child; |
| 256 | 256 | ||
| 257 | dst_release(dst); | 257 | skb_dst_drop(skb); |
| 258 | return child; | 258 | return child; |
| 259 | } | 259 | } |
| 260 | 260 | ||
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 55be90826f5f..529842677817 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -708,7 +708,8 @@ static int vlan_dev_init(struct net_device *dev) | |||
| 708 | netif_carrier_off(dev); | 708 | netif_carrier_off(dev); |
| 709 | 709 | ||
| 710 | /* IFF_BROADCAST|IFF_MULTICAST; ??? */ | 710 | /* IFF_BROADCAST|IFF_MULTICAST; ??? */ |
| 711 | dev->flags = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI); | 711 | dev->flags = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | |
| 712 | IFF_MASTER | IFF_SLAVE); | ||
| 712 | dev->iflink = real_dev->ifindex; | 713 | dev->iflink = real_dev->ifindex; |
| 713 | dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) | | 714 | dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) | |
| 714 | (1<<__LINK_STATE_DORMANT))) | | 715 | (1<<__LINK_STATE_DORMANT))) | |
diff --git a/net/core/dev.c b/net/core/dev.c index 1845b08c624e..d03470f5260a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2795,7 +2795,7 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
| 2795 | struct net_device *orig_dev; | 2795 | struct net_device *orig_dev; |
| 2796 | struct net_device *master; | 2796 | struct net_device *master; |
| 2797 | struct net_device *null_or_orig; | 2797 | struct net_device *null_or_orig; |
| 2798 | struct net_device *null_or_bond; | 2798 | struct net_device *orig_or_bond; |
| 2799 | int ret = NET_RX_DROP; | 2799 | int ret = NET_RX_DROP; |
| 2800 | __be16 type; | 2800 | __be16 type; |
| 2801 | 2801 | ||
| @@ -2868,10 +2868,10 @@ ncls: | |||
| 2868 | * device that may have registered for a specific ptype. The | 2868 | * device that may have registered for a specific ptype. The |
| 2869 | * handler may have to adjust skb->dev and orig_dev. | 2869 | * handler may have to adjust skb->dev and orig_dev. |
| 2870 | */ | 2870 | */ |
| 2871 | null_or_bond = NULL; | 2871 | orig_or_bond = orig_dev; |
| 2872 | if ((skb->dev->priv_flags & IFF_802_1Q_VLAN) && | 2872 | if ((skb->dev->priv_flags & IFF_802_1Q_VLAN) && |
| 2873 | (vlan_dev_real_dev(skb->dev)->priv_flags & IFF_BONDING)) { | 2873 | (vlan_dev_real_dev(skb->dev)->priv_flags & IFF_BONDING)) { |
| 2874 | null_or_bond = vlan_dev_real_dev(skb->dev); | 2874 | orig_or_bond = vlan_dev_real_dev(skb->dev); |
| 2875 | } | 2875 | } |
| 2876 | 2876 | ||
| 2877 | type = skb->protocol; | 2877 | type = skb->protocol; |
| @@ -2879,7 +2879,7 @@ ncls: | |||
| 2879 | &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { | 2879 | &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { |
| 2880 | if (ptype->type == type && (ptype->dev == null_or_orig || | 2880 | if (ptype->type == type && (ptype->dev == null_or_orig || |
| 2881 | ptype->dev == skb->dev || ptype->dev == orig_dev || | 2881 | ptype->dev == skb->dev || ptype->dev == orig_dev || |
| 2882 | ptype->dev == null_or_bond)) { | 2882 | ptype->dev == orig_or_bond)) { |
| 2883 | if (pt_prev) | 2883 | if (pt_prev) |
| 2884 | ret = deliver_skb(skb, pt_prev, orig_dev); | 2884 | ret = deliver_skb(skb, pt_prev, orig_dev); |
| 2885 | pt_prev = ptype; | 2885 | pt_prev = ptype; |
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig index 8e3a1fd938ab..7c3a7d191249 100644 --- a/net/ipv4/Kconfig +++ b/net/ipv4/Kconfig | |||
| @@ -303,7 +303,7 @@ config ARPD | |||
| 303 | If unsure, say N. | 303 | If unsure, say N. |
| 304 | 304 | ||
| 305 | config SYN_COOKIES | 305 | config SYN_COOKIES |
| 306 | bool "IP: TCP syncookie support (disabled per default)" | 306 | bool "IP: TCP syncookie support" |
| 307 | ---help--- | 307 | ---help--- |
| 308 | Normal TCP/IP networking is open to an attack known as "SYN | 308 | Normal TCP/IP networking is open to an attack known as "SYN |
| 309 | flooding". This denial-of-service attack prevents legitimate remote | 309 | flooding". This denial-of-service attack prevents legitimate remote |
| @@ -328,13 +328,13 @@ config SYN_COOKIES | |||
| 328 | server is really overloaded. If this happens frequently better turn | 328 | server is really overloaded. If this happens frequently better turn |
| 329 | them off. | 329 | them off. |
| 330 | 330 | ||
| 331 | If you say Y here, note that SYN cookies aren't enabled by default; | 331 | If you say Y here, you can disable SYN cookies at run time by |
| 332 | you can enable them by saying Y to "/proc file system support" and | 332 | saying Y to "/proc file system support" and |
| 333 | "Sysctl support" below and executing the command | 333 | "Sysctl support" below and executing the command |
| 334 | 334 | ||
| 335 | echo 1 >/proc/sys/net/ipv4/tcp_syncookies | 335 | echo 0 > /proc/sys/net/ipv4/tcp_syncookies |
| 336 | 336 | ||
| 337 | at boot time after the /proc file system has been mounted. | 337 | after the /proc file system has been mounted. |
| 338 | 338 | ||
| 339 | If unsure, say N. | 339 | If unsure, say N. |
| 340 | 340 | ||
diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c index 5c24db4a3c91..9f6b22206c52 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c | |||
| @@ -347,7 +347,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | |||
| 347 | { .sport = th->dest, | 347 | { .sport = th->dest, |
| 348 | .dport = th->source } } }; | 348 | .dport = th->source } } }; |
| 349 | security_req_classify_flow(req, &fl); | 349 | security_req_classify_flow(req, &fl); |
| 350 | if (ip_route_output_key(&init_net, &rt, &fl)) { | 350 | if (ip_route_output_key(sock_net(sk), &rt, &fl)) { |
| 351 | reqsk_free(req); | 351 | reqsk_free(req); |
| 352 | goto out; | 352 | goto out; |
| 353 | } | 353 | } |
diff --git a/net/ipv4/tcp_hybla.c b/net/ipv4/tcp_hybla.c index c209e054a634..377bc9349371 100644 --- a/net/ipv4/tcp_hybla.c +++ b/net/ipv4/tcp_hybla.c | |||
| @@ -126,8 +126,8 @@ static void hybla_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 126 | * calculate 2^fract in a <<7 value. | 126 | * calculate 2^fract in a <<7 value. |
| 127 | */ | 127 | */ |
| 128 | is_slowstart = 1; | 128 | is_slowstart = 1; |
| 129 | increment = ((1 << ca->rho) * hybla_fraction(rho_fractions)) | 129 | increment = ((1 << min(ca->rho, 16U)) * |
| 130 | - 128; | 130 | hybla_fraction(rho_fractions)) - 128; |
| 131 | } else { | 131 | } else { |
| 132 | /* | 132 | /* |
| 133 | * congestion avoidance | 133 | * congestion avoidance |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 202cf09c4cd4..fe193e53af44 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -1555,6 +1555,7 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 1555 | #endif | 1555 | #endif |
| 1556 | 1556 | ||
| 1557 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ | 1557 | if (sk->sk_state == TCP_ESTABLISHED) { /* Fast path */ |
| 1558 | sock_rps_save_rxhash(sk, skb->rxhash); | ||
| 1558 | TCP_CHECK_TIMER(sk); | 1559 | TCP_CHECK_TIMER(sk); |
| 1559 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { | 1560 | if (tcp_rcv_established(sk, skb, tcp_hdr(skb), skb->len)) { |
| 1560 | rsk = sk; | 1561 | rsk = sk; |
| @@ -1579,7 +1580,9 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb) | |||
| 1579 | } | 1580 | } |
| 1580 | return 0; | 1581 | return 0; |
| 1581 | } | 1582 | } |
| 1582 | } | 1583 | } else |
| 1584 | sock_rps_save_rxhash(sk, skb->rxhash); | ||
| 1585 | |||
| 1583 | 1586 | ||
| 1584 | TCP_CHECK_TIMER(sk); | 1587 | TCP_CHECK_TIMER(sk); |
| 1585 | if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) { | 1588 | if (tcp_rcv_state_process(sk, skb, tcp_hdr(skb), skb->len)) { |
| @@ -1672,8 +1675,6 @@ process: | |||
| 1672 | 1675 | ||
| 1673 | skb->dev = NULL; | 1676 | skb->dev = NULL; |
| 1674 | 1677 | ||
| 1675 | sock_rps_save_rxhash(sk, skb->rxhash); | ||
| 1676 | |||
| 1677 | bh_lock_sock_nested(sk); | 1678 | bh_lock_sock_nested(sk); |
| 1678 | ret = 0; | 1679 | ret = 0; |
| 1679 | if (!sock_owned_by_user(sk)) { | 1680 | if (!sock_owned_by_user(sk)) { |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index c163d0a149f4..98258b7341e3 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
| @@ -332,14 +332,16 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid) | |||
| 332 | IEEE80211_QUEUE_STOP_REASON_AGGREGATION); | 332 | IEEE80211_QUEUE_STOP_REASON_AGGREGATION); |
| 333 | 333 | ||
| 334 | spin_unlock(&local->ampdu_lock); | 334 | spin_unlock(&local->ampdu_lock); |
| 335 | spin_unlock_bh(&sta->lock); | ||
| 336 | 335 | ||
| 337 | /* send an addBA request */ | 336 | /* prepare tid data */ |
| 338 | sta->ampdu_mlme.dialog_token_allocator++; | 337 | sta->ampdu_mlme.dialog_token_allocator++; |
| 339 | sta->ampdu_mlme.tid_tx[tid]->dialog_token = | 338 | sta->ampdu_mlme.tid_tx[tid]->dialog_token = |
| 340 | sta->ampdu_mlme.dialog_token_allocator; | 339 | sta->ampdu_mlme.dialog_token_allocator; |
| 341 | sta->ampdu_mlme.tid_tx[tid]->ssn = start_seq_num; | 340 | sta->ampdu_mlme.tid_tx[tid]->ssn = start_seq_num; |
| 342 | 341 | ||
| 342 | spin_unlock_bh(&sta->lock); | ||
| 343 | |||
| 344 | /* send AddBA request */ | ||
| 343 | ieee80211_send_addba_request(sdata, pubsta->addr, tid, | 345 | ieee80211_send_addba_request(sdata, pubsta->addr, tid, |
| 344 | sta->ampdu_mlme.tid_tx[tid]->dialog_token, | 346 | sta->ampdu_mlme.tid_tx[tid]->dialog_token, |
| 345 | sta->ampdu_mlme.tid_tx[tid]->ssn, | 347 | sta->ampdu_mlme.tid_tx[tid]->ssn, |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 6e2a7bcd8cb8..5e0b65406c44 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -1818,17 +1818,26 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx, struct sk_buff_head *frames) | |||
| 1818 | return RX_CONTINUE; | 1818 | return RX_CONTINUE; |
| 1819 | 1819 | ||
| 1820 | if (ieee80211_is_back_req(bar->frame_control)) { | 1820 | if (ieee80211_is_back_req(bar->frame_control)) { |
| 1821 | struct { | ||
| 1822 | __le16 control, start_seq_num; | ||
| 1823 | } __packed bar_data; | ||
| 1824 | |||
| 1821 | if (!rx->sta) | 1825 | if (!rx->sta) |
| 1822 | return RX_DROP_MONITOR; | 1826 | return RX_DROP_MONITOR; |
| 1827 | |||
| 1828 | if (skb_copy_bits(skb, offsetof(struct ieee80211_bar, control), | ||
| 1829 | &bar_data, sizeof(bar_data))) | ||
| 1830 | return RX_DROP_MONITOR; | ||
| 1831 | |||
| 1823 | spin_lock(&rx->sta->lock); | 1832 | spin_lock(&rx->sta->lock); |
| 1824 | tid = le16_to_cpu(bar->control) >> 12; | 1833 | tid = le16_to_cpu(bar_data.control) >> 12; |
| 1825 | if (!rx->sta->ampdu_mlme.tid_active_rx[tid]) { | 1834 | if (!rx->sta->ampdu_mlme.tid_active_rx[tid]) { |
| 1826 | spin_unlock(&rx->sta->lock); | 1835 | spin_unlock(&rx->sta->lock); |
| 1827 | return RX_DROP_MONITOR; | 1836 | return RX_DROP_MONITOR; |
| 1828 | } | 1837 | } |
| 1829 | tid_agg_rx = rx->sta->ampdu_mlme.tid_rx[tid]; | 1838 | tid_agg_rx = rx->sta->ampdu_mlme.tid_rx[tid]; |
| 1830 | 1839 | ||
| 1831 | start_seq_num = le16_to_cpu(bar->start_seq_num) >> 4; | 1840 | start_seq_num = le16_to_cpu(bar_data.start_seq_num) >> 4; |
| 1832 | 1841 | ||
| 1833 | /* reset session timer */ | 1842 | /* reset session timer */ |
| 1834 | if (tid_agg_rx->timeout) | 1843 | if (tid_agg_rx->timeout) |
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index d885ba311564..570949417f38 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c | |||
| @@ -159,6 +159,9 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 159 | iph->daddr = new_addr; | 159 | iph->daddr = new_addr; |
| 160 | 160 | ||
| 161 | csum_replace4(&iph->check, addr, new_addr); | 161 | csum_replace4(&iph->check, addr, new_addr); |
| 162 | } else if ((iph->frag_off & htons(IP_OFFSET)) || | ||
| 163 | iph->protocol != IPPROTO_ICMP) { | ||
| 164 | goto out; | ||
| 162 | } | 165 | } |
| 163 | 166 | ||
| 164 | ihl = iph->ihl * 4; | 167 | ihl = iph->ihl * 4; |
| @@ -247,6 +250,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 247 | break; | 250 | break; |
| 248 | } | 251 | } |
| 249 | 252 | ||
| 253 | out: | ||
| 250 | return action; | 254 | return action; |
| 251 | 255 | ||
| 252 | drop: | 256 | drop: |
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index fdbd0b7bd840..50e3d945e1f4 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
| @@ -125,7 +125,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, | |||
| 125 | { | 125 | { |
| 126 | struct tcf_pedit *p = a->priv; | 126 | struct tcf_pedit *p = a->priv; |
| 127 | int i, munged = 0; | 127 | int i, munged = 0; |
| 128 | u8 *pptr; | 128 | unsigned int off; |
| 129 | 129 | ||
| 130 | if (!(skb->tc_verd & TC_OK2MUNGE)) { | 130 | if (!(skb->tc_verd & TC_OK2MUNGE)) { |
| 131 | /* should we set skb->cloned? */ | 131 | /* should we set skb->cloned? */ |
| @@ -134,7 +134,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, | |||
| 134 | } | 134 | } |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | pptr = skb_network_header(skb); | 137 | off = skb_network_offset(skb); |
| 138 | 138 | ||
| 139 | spin_lock(&p->tcf_lock); | 139 | spin_lock(&p->tcf_lock); |
| 140 | 140 | ||
| @@ -144,17 +144,17 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, | |||
| 144 | struct tc_pedit_key *tkey = p->tcfp_keys; | 144 | struct tc_pedit_key *tkey = p->tcfp_keys; |
| 145 | 145 | ||
| 146 | for (i = p->tcfp_nkeys; i > 0; i--, tkey++) { | 146 | for (i = p->tcfp_nkeys; i > 0; i--, tkey++) { |
| 147 | u32 *ptr; | 147 | u32 *ptr, _data; |
| 148 | int offset = tkey->off; | 148 | int offset = tkey->off; |
| 149 | 149 | ||
| 150 | if (tkey->offmask) { | 150 | if (tkey->offmask) { |
| 151 | if (skb->len > tkey->at) { | 151 | char *d, _d; |
| 152 | char *j = pptr + tkey->at; | 152 | |
| 153 | offset += ((*j & tkey->offmask) >> | 153 | d = skb_header_pointer(skb, off + tkey->at, 1, |
| 154 | tkey->shift); | 154 | &_d); |
| 155 | } else { | 155 | if (!d) |
| 156 | goto bad; | 156 | goto bad; |
| 157 | } | 157 | offset += (*d & tkey->offmask) >> tkey->shift; |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | if (offset % 4) { | 160 | if (offset % 4) { |
| @@ -169,9 +169,13 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, | |||
| 169 | goto bad; | 169 | goto bad; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | ptr = (u32 *)(pptr+offset); | 172 | ptr = skb_header_pointer(skb, off + offset, 4, &_data); |
| 173 | if (!ptr) | ||
| 174 | goto bad; | ||
| 173 | /* just do it, baby */ | 175 | /* just do it, baby */ |
| 174 | *ptr = ((*ptr & tkey->mask) ^ tkey->val); | 176 | *ptr = ((*ptr & tkey->mask) ^ tkey->val); |
| 177 | if (ptr == &_data) | ||
| 178 | skb_store_bits(skb, off + offset, ptr, 4); | ||
| 175 | munged++; | 179 | munged++; |
| 176 | } | 180 | } |
| 177 | 181 | ||
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 96275422c619..4f522143811e 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
| @@ -98,11 +98,11 @@ static int u32_classify(struct sk_buff *skb, struct tcf_proto *tp, struct tcf_re | |||
| 98 | { | 98 | { |
| 99 | struct { | 99 | struct { |
| 100 | struct tc_u_knode *knode; | 100 | struct tc_u_knode *knode; |
| 101 | u8 *ptr; | 101 | unsigned int off; |
| 102 | } stack[TC_U32_MAXDEPTH]; | 102 | } stack[TC_U32_MAXDEPTH]; |
| 103 | 103 | ||
| 104 | struct tc_u_hnode *ht = (struct tc_u_hnode*)tp->root; | 104 | struct tc_u_hnode *ht = (struct tc_u_hnode*)tp->root; |
| 105 | u8 *ptr = skb_network_header(skb); | 105 | unsigned int off = skb_network_offset(skb); |
| 106 | struct tc_u_knode *n; | 106 | struct tc_u_knode *n; |
| 107 | int sdepth = 0; | 107 | int sdepth = 0; |
| 108 | int off2 = 0; | 108 | int off2 = 0; |
| @@ -134,8 +134,14 @@ next_knode: | |||
| 134 | #endif | 134 | #endif |
| 135 | 135 | ||
| 136 | for (i = n->sel.nkeys; i>0; i--, key++) { | 136 | for (i = n->sel.nkeys; i>0; i--, key++) { |
| 137 | 137 | unsigned int toff; | |
| 138 | if ((*(__be32*)(ptr+key->off+(off2&key->offmask))^key->val)&key->mask) { | 138 | __be32 *data, _data; |
| 139 | |||
| 140 | toff = off + key->off + (off2 & key->offmask); | ||
| 141 | data = skb_header_pointer(skb, toff, 4, &_data); | ||
| 142 | if (!data) | ||
| 143 | goto out; | ||
| 144 | if ((*data ^ key->val) & key->mask) { | ||
| 139 | n = n->next; | 145 | n = n->next; |
| 140 | goto next_knode; | 146 | goto next_knode; |
| 141 | } | 147 | } |
| @@ -174,29 +180,45 @@ check_terminal: | |||
| 174 | if (sdepth >= TC_U32_MAXDEPTH) | 180 | if (sdepth >= TC_U32_MAXDEPTH) |
| 175 | goto deadloop; | 181 | goto deadloop; |
| 176 | stack[sdepth].knode = n; | 182 | stack[sdepth].knode = n; |
| 177 | stack[sdepth].ptr = ptr; | 183 | stack[sdepth].off = off; |
| 178 | sdepth++; | 184 | sdepth++; |
| 179 | 185 | ||
| 180 | ht = n->ht_down; | 186 | ht = n->ht_down; |
| 181 | sel = 0; | 187 | sel = 0; |
| 182 | if (ht->divisor) | 188 | if (ht->divisor) { |
| 183 | sel = ht->divisor&u32_hash_fold(*(__be32*)(ptr+n->sel.hoff), &n->sel,n->fshift); | 189 | __be32 *data, _data; |
| 184 | 190 | ||
| 191 | data = skb_header_pointer(skb, off + n->sel.hoff, 4, | ||
| 192 | &_data); | ||
| 193 | if (!data) | ||
| 194 | goto out; | ||
| 195 | sel = ht->divisor & u32_hash_fold(*data, &n->sel, | ||
| 196 | n->fshift); | ||
| 197 | } | ||
| 185 | if (!(n->sel.flags&(TC_U32_VAROFFSET|TC_U32_OFFSET|TC_U32_EAT))) | 198 | if (!(n->sel.flags&(TC_U32_VAROFFSET|TC_U32_OFFSET|TC_U32_EAT))) |
| 186 | goto next_ht; | 199 | goto next_ht; |
| 187 | 200 | ||
| 188 | if (n->sel.flags&(TC_U32_OFFSET|TC_U32_VAROFFSET)) { | 201 | if (n->sel.flags&(TC_U32_OFFSET|TC_U32_VAROFFSET)) { |
| 189 | off2 = n->sel.off + 3; | 202 | off2 = n->sel.off + 3; |
| 190 | if (n->sel.flags&TC_U32_VAROFFSET) | 203 | if (n->sel.flags & TC_U32_VAROFFSET) { |
| 191 | off2 += ntohs(n->sel.offmask & *(__be16*)(ptr+n->sel.offoff)) >>n->sel.offshift; | 204 | __be16 *data, _data; |
| 205 | |||
| 206 | data = skb_header_pointer(skb, | ||
| 207 | off + n->sel.offoff, | ||
| 208 | 2, &_data); | ||
| 209 | if (!data) | ||
| 210 | goto out; | ||
| 211 | off2 += ntohs(n->sel.offmask & *data) >> | ||
| 212 | n->sel.offshift; | ||
| 213 | } | ||
| 192 | off2 &= ~3; | 214 | off2 &= ~3; |
| 193 | } | 215 | } |
| 194 | if (n->sel.flags&TC_U32_EAT) { | 216 | if (n->sel.flags&TC_U32_EAT) { |
| 195 | ptr += off2; | 217 | off += off2; |
| 196 | off2 = 0; | 218 | off2 = 0; |
| 197 | } | 219 | } |
| 198 | 220 | ||
| 199 | if (ptr < skb_tail_pointer(skb)) | 221 | if (off < skb->len) |
| 200 | goto next_ht; | 222 | goto next_ht; |
| 201 | } | 223 | } |
| 202 | 224 | ||
| @@ -204,9 +226,10 @@ check_terminal: | |||
| 204 | if (sdepth--) { | 226 | if (sdepth--) { |
| 205 | n = stack[sdepth].knode; | 227 | n = stack[sdepth].knode; |
| 206 | ht = n->ht_up; | 228 | ht = n->ht_up; |
| 207 | ptr = stack[sdepth].ptr; | 229 | off = stack[sdepth].off; |
| 208 | goto check_terminal; | 230 | goto check_terminal; |
| 209 | } | 231 | } |
| 232 | out: | ||
| 210 | return -1; | 233 | return -1; |
| 211 | 234 | ||
| 212 | deadloop: | 235 | deadloop: |
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 6a329158bdfa..a3cca0a94346 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
| @@ -95,13 +95,13 @@ resume: | |||
| 95 | goto error_nolock; | 95 | goto error_nolock; |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | dst = dst_pop(dst); | 98 | dst = skb_dst_pop(skb); |
| 99 | if (!dst) { | 99 | if (!dst) { |
| 100 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); | 100 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR); |
| 101 | err = -EHOSTUNREACH; | 101 | err = -EHOSTUNREACH; |
| 102 | goto error_nolock; | 102 | goto error_nolock; |
| 103 | } | 103 | } |
| 104 | skb_dst_set(skb, dst); | 104 | skb_dst_set_noref(skb, dst); |
| 105 | x = dst->xfrm; | 105 | x = dst->xfrm; |
| 106 | } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL)); | 106 | } while (x && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL)); |
| 107 | 107 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index d965a2bad8d3..4bf27d901333 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -2153,6 +2153,7 @@ int __xfrm_route_forward(struct sk_buff *skb, unsigned short family) | |||
| 2153 | return 0; | 2153 | return 0; |
| 2154 | } | 2154 | } |
| 2155 | 2155 | ||
| 2156 | skb_dst_force(skb); | ||
| 2156 | dst = skb_dst(skb); | 2157 | dst = skb_dst(skb); |
| 2157 | 2158 | ||
| 2158 | res = xfrm_lookup(net, &dst, &fl, NULL, 0) == 0; | 2159 | res = xfrm_lookup(net, &dst, &fl, NULL, 0) == 0; |
