diff options
92 files changed, 995 insertions, 678 deletions
diff --git a/Documentation/sysctl/net.txt b/Documentation/sysctl/net.txt index 1c15043aaee4..d569f2a424d5 100644 --- a/Documentation/sysctl/net.txt +++ b/Documentation/sysctl/net.txt | |||
| @@ -52,7 +52,7 @@ Default: 64 | |||
| 52 | 52 | ||
| 53 | busy_read | 53 | busy_read |
| 54 | ---------------- | 54 | ---------------- |
| 55 | Low latency busy poll timeout for socket reads. (needs CONFIG_NET_LL_RX_POLL) | 55 | Low latency busy poll timeout for socket reads. (needs CONFIG_NET_RX_BUSY_POLL) |
| 56 | Approximate time in us to busy loop waiting for packets on the device queue. | 56 | Approximate time in us to busy loop waiting for packets on the device queue. |
| 57 | This sets the default value of the SO_BUSY_POLL socket option. | 57 | This sets the default value of the SO_BUSY_POLL socket option. |
| 58 | Can be set or overridden per socket by setting socket option SO_BUSY_POLL, | 58 | Can be set or overridden per socket by setting socket option SO_BUSY_POLL, |
| @@ -63,7 +63,7 @@ Default: 0 (off) | |||
| 63 | 63 | ||
| 64 | busy_poll | 64 | busy_poll |
| 65 | ---------------- | 65 | ---------------- |
| 66 | Low latency busy poll timeout for poll and select. (needs CONFIG_NET_LL_RX_POLL) | 66 | Low latency busy poll timeout for poll and select. (needs CONFIG_NET_RX_BUSY_POLL) |
| 67 | Approximate time in us to busy loop waiting for events. | 67 | Approximate time in us to busy loop waiting for events. |
| 68 | Recommended value depends on the number of sockets you poll on. | 68 | Recommended value depends on the number of sockets you poll on. |
| 69 | For several sockets 50, for several hundreds 100. | 69 | For several sockets 50, for several hundreds 100. |
diff --git a/MAINTAINERS b/MAINTAINERS index d83f70ffdbed..defc05383f83 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1406,7 +1406,7 @@ ATHEROS ATH6KL WIRELESS DRIVER | |||
| 1406 | M: Kalle Valo <kvalo@qca.qualcomm.com> | 1406 | M: Kalle Valo <kvalo@qca.qualcomm.com> |
| 1407 | L: linux-wireless@vger.kernel.org | 1407 | L: linux-wireless@vger.kernel.org |
| 1408 | W: http://wireless.kernel.org/en/users/Drivers/ath6kl | 1408 | W: http://wireless.kernel.org/en/users/Drivers/ath6kl |
| 1409 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath6kl.git | 1409 | T: git git://github.com/kvalo/ath.git |
| 1410 | S: Supported | 1410 | S: Supported |
| 1411 | F: drivers/net/wireless/ath/ath6kl/ | 1411 | F: drivers/net/wireless/ath/ath6kl/ |
| 1412 | 1412 | ||
| @@ -6726,6 +6726,14 @@ T: git git://linuxtv.org/anttip/media_tree.git | |||
| 6726 | S: Maintained | 6726 | S: Maintained |
| 6727 | F: drivers/media/tuners/qt1010* | 6727 | F: drivers/media/tuners/qt1010* |
| 6728 | 6728 | ||
| 6729 | QUALCOMM ATHEROS ATH10K WIRELESS DRIVER | ||
| 6730 | M: Kalle Valo <kvalo@qca.qualcomm.com> | ||
| 6731 | L: ath10k@lists.infradead.org | ||
| 6732 | W: http://wireless.kernel.org/en/users/Drivers/ath10k | ||
| 6733 | T: git git://github.com/kvalo/ath.git | ||
| 6734 | S: Supported | ||
| 6735 | F: drivers/net/wireless/ath/ath10k/ | ||
| 6736 | |||
| 6729 | QUALCOMM HEXAGON ARCHITECTURE | 6737 | QUALCOMM HEXAGON ARCHITECTURE |
| 6730 | M: Richard Kuo <rkuo@codeaurora.org> | 6738 | M: Richard Kuo <rkuo@codeaurora.org> |
| 6731 | L: linux-hexagon@vger.kernel.org | 6739 | L: linux-hexagon@vger.kernel.org |
| @@ -8270,7 +8278,7 @@ S: Maintained | |||
| 8270 | F: sound/soc/codecs/twl4030* | 8278 | F: sound/soc/codecs/twl4030* |
| 8271 | 8279 | ||
| 8272 | TI WILINK WIRELESS DRIVERS | 8280 | TI WILINK WIRELESS DRIVERS |
| 8273 | M: Luciano Coelho <coelho@ti.com> | 8281 | M: Luciano Coelho <luca@coelho.fi> |
| 8274 | L: linux-wireless@vger.kernel.org | 8282 | L: linux-wireless@vger.kernel.org |
| 8275 | W: http://wireless.kernel.org/en/users/Drivers/wl12xx | 8283 | W: http://wireless.kernel.org/en/users/Drivers/wl12xx |
| 8276 | W: http://wireless.kernel.org/en/users/Drivers/wl1251 | 8284 | W: http://wireless.kernel.org/en/users/Drivers/wl1251 |
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c index 11f467c00d0a..a12b923bbaca 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c | |||
| @@ -91,6 +91,10 @@ static struct usb_device_id ath3k_table[] = { | |||
| 91 | { USB_DEVICE(0x0489, 0xe04e) }, | 91 | { USB_DEVICE(0x0489, 0xe04e) }, |
| 92 | { USB_DEVICE(0x0489, 0xe056) }, | 92 | { USB_DEVICE(0x0489, 0xe056) }, |
| 93 | { USB_DEVICE(0x0489, 0xe04d) }, | 93 | { USB_DEVICE(0x0489, 0xe04d) }, |
| 94 | { USB_DEVICE(0x04c5, 0x1330) }, | ||
| 95 | { USB_DEVICE(0x13d3, 0x3402) }, | ||
| 96 | { USB_DEVICE(0x0cf3, 0x3121) }, | ||
| 97 | { USB_DEVICE(0x0cf3, 0xe003) }, | ||
| 94 | 98 | ||
| 95 | /* Atheros AR5BBU12 with sflash firmware */ | 99 | /* Atheros AR5BBU12 with sflash firmware */ |
| 96 | { USB_DEVICE(0x0489, 0xE02C) }, | 100 | { USB_DEVICE(0x0489, 0xE02C) }, |
| @@ -128,6 +132,10 @@ static struct usb_device_id ath3k_blist_tbl[] = { | |||
| 128 | { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 }, | 132 | { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 }, |
| 129 | { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, | 133 | { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, |
| 130 | { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 }, | 134 | { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 }, |
| 135 | { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, | ||
| 136 | { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, | ||
| 137 | { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 }, | ||
| 138 | { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 }, | ||
| 131 | 139 | ||
| 132 | /* Atheros AR5BBU22 with sflash firmware */ | 140 | /* Atheros AR5BBU22 with sflash firmware */ |
| 133 | { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, | 141 | { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, |
| @@ -193,24 +201,44 @@ error: | |||
| 193 | 201 | ||
| 194 | static int ath3k_get_state(struct usb_device *udev, unsigned char *state) | 202 | static int ath3k_get_state(struct usb_device *udev, unsigned char *state) |
| 195 | { | 203 | { |
| 196 | int pipe = 0; | 204 | int ret, pipe = 0; |
| 205 | char *buf; | ||
| 206 | |||
| 207 | buf = kmalloc(sizeof(*buf), GFP_KERNEL); | ||
| 208 | if (!buf) | ||
| 209 | return -ENOMEM; | ||
| 197 | 210 | ||
| 198 | pipe = usb_rcvctrlpipe(udev, 0); | 211 | pipe = usb_rcvctrlpipe(udev, 0); |
| 199 | return usb_control_msg(udev, pipe, ATH3K_GETSTATE, | 212 | ret = usb_control_msg(udev, pipe, ATH3K_GETSTATE, |
| 200 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, | 213 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, |
| 201 | state, 0x01, USB_CTRL_SET_TIMEOUT); | 214 | buf, sizeof(*buf), USB_CTRL_SET_TIMEOUT); |
| 215 | |||
| 216 | *state = *buf; | ||
| 217 | kfree(buf); | ||
| 218 | |||
| 219 | return ret; | ||
| 202 | } | 220 | } |
| 203 | 221 | ||
| 204 | static int ath3k_get_version(struct usb_device *udev, | 222 | static int ath3k_get_version(struct usb_device *udev, |
| 205 | struct ath3k_version *version) | 223 | struct ath3k_version *version) |
| 206 | { | 224 | { |
| 207 | int pipe = 0; | 225 | int ret, pipe = 0; |
| 226 | struct ath3k_version *buf; | ||
| 227 | const int size = sizeof(*buf); | ||
| 228 | |||
| 229 | buf = kmalloc(size, GFP_KERNEL); | ||
| 230 | if (!buf) | ||
| 231 | return -ENOMEM; | ||
| 208 | 232 | ||
| 209 | pipe = usb_rcvctrlpipe(udev, 0); | 233 | pipe = usb_rcvctrlpipe(udev, 0); |
| 210 | return usb_control_msg(udev, pipe, ATH3K_GETVERSION, | 234 | ret = usb_control_msg(udev, pipe, ATH3K_GETVERSION, |
| 211 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, version, | 235 | USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, |
| 212 | sizeof(struct ath3k_version), | 236 | buf, size, USB_CTRL_SET_TIMEOUT); |
| 213 | USB_CTRL_SET_TIMEOUT); | 237 | |
| 238 | memcpy(version, buf, size); | ||
| 239 | kfree(buf); | ||
| 240 | |||
| 241 | return ret; | ||
| 214 | } | 242 | } |
| 215 | 243 | ||
| 216 | static int ath3k_load_fwfile(struct usb_device *udev, | 244 | static int ath3k_load_fwfile(struct usb_device *udev, |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index de4cf4daa2f4..8e16f0af6358 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
| @@ -154,6 +154,10 @@ static struct usb_device_id blacklist_table[] = { | |||
| 154 | { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 }, | 154 | { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 }, |
| 155 | { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, | 155 | { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, |
| 156 | { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 }, | 156 | { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 }, |
| 157 | { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, | ||
| 158 | { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, | ||
| 159 | { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 }, | ||
| 160 | { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 }, | ||
| 157 | 161 | ||
| 158 | /* Atheros AR5BBU12 with sflash firmware */ | 162 | /* Atheros AR5BBU12 with sflash firmware */ |
| 159 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, | 163 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, |
| @@ -1095,7 +1099,7 @@ static int btusb_setup_intel_patching(struct hci_dev *hdev, | |||
| 1095 | if (IS_ERR(skb)) { | 1099 | if (IS_ERR(skb)) { |
| 1096 | BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)", | 1100 | BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)", |
| 1097 | hdev->name, cmd->opcode, PTR_ERR(skb)); | 1101 | hdev->name, cmd->opcode, PTR_ERR(skb)); |
| 1098 | return -PTR_ERR(skb); | 1102 | return PTR_ERR(skb); |
| 1099 | } | 1103 | } |
| 1100 | 1104 | ||
| 1101 | /* It ensures that the returned event matches the event data read from | 1105 | /* It ensures that the returned event matches the event data read from |
| @@ -1147,7 +1151,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) | |||
| 1147 | if (IS_ERR(skb)) { | 1151 | if (IS_ERR(skb)) { |
| 1148 | BT_ERR("%s sending initial HCI reset command failed (%ld)", | 1152 | BT_ERR("%s sending initial HCI reset command failed (%ld)", |
| 1149 | hdev->name, PTR_ERR(skb)); | 1153 | hdev->name, PTR_ERR(skb)); |
| 1150 | return -PTR_ERR(skb); | 1154 | return PTR_ERR(skb); |
| 1151 | } | 1155 | } |
| 1152 | kfree_skb(skb); | 1156 | kfree_skb(skb); |
| 1153 | 1157 | ||
| @@ -1161,7 +1165,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) | |||
| 1161 | if (IS_ERR(skb)) { | 1165 | if (IS_ERR(skb)) { |
| 1162 | BT_ERR("%s reading Intel fw version command failed (%ld)", | 1166 | BT_ERR("%s reading Intel fw version command failed (%ld)", |
| 1163 | hdev->name, PTR_ERR(skb)); | 1167 | hdev->name, PTR_ERR(skb)); |
| 1164 | return -PTR_ERR(skb); | 1168 | return PTR_ERR(skb); |
| 1165 | } | 1169 | } |
| 1166 | 1170 | ||
| 1167 | if (skb->len != sizeof(*ver)) { | 1171 | if (skb->len != sizeof(*ver)) { |
| @@ -1219,7 +1223,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) | |||
| 1219 | BT_ERR("%s entering Intel manufacturer mode failed (%ld)", | 1223 | BT_ERR("%s entering Intel manufacturer mode failed (%ld)", |
| 1220 | hdev->name, PTR_ERR(skb)); | 1224 | hdev->name, PTR_ERR(skb)); |
| 1221 | release_firmware(fw); | 1225 | release_firmware(fw); |
| 1222 | return -PTR_ERR(skb); | 1226 | return PTR_ERR(skb); |
| 1223 | } | 1227 | } |
| 1224 | 1228 | ||
| 1225 | if (skb->data[0]) { | 1229 | if (skb->data[0]) { |
| @@ -1276,7 +1280,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) | |||
| 1276 | if (IS_ERR(skb)) { | 1280 | if (IS_ERR(skb)) { |
| 1277 | BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", | 1281 | BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", |
| 1278 | hdev->name, PTR_ERR(skb)); | 1282 | hdev->name, PTR_ERR(skb)); |
| 1279 | return -PTR_ERR(skb); | 1283 | return PTR_ERR(skb); |
| 1280 | } | 1284 | } |
| 1281 | kfree_skb(skb); | 1285 | kfree_skb(skb); |
| 1282 | 1286 | ||
| @@ -1292,7 +1296,7 @@ exit_mfg_disable: | |||
| 1292 | if (IS_ERR(skb)) { | 1296 | if (IS_ERR(skb)) { |
| 1293 | BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", | 1297 | BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", |
| 1294 | hdev->name, PTR_ERR(skb)); | 1298 | hdev->name, PTR_ERR(skb)); |
| 1295 | return -PTR_ERR(skb); | 1299 | return PTR_ERR(skb); |
| 1296 | } | 1300 | } |
| 1297 | kfree_skb(skb); | 1301 | kfree_skb(skb); |
| 1298 | 1302 | ||
| @@ -1310,7 +1314,7 @@ exit_mfg_deactivate: | |||
| 1310 | if (IS_ERR(skb)) { | 1314 | if (IS_ERR(skb)) { |
| 1311 | BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", | 1315 | BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", |
| 1312 | hdev->name, PTR_ERR(skb)); | 1316 | hdev->name, PTR_ERR(skb)); |
| 1313 | return -PTR_ERR(skb); | 1317 | return PTR_ERR(skb); |
| 1314 | } | 1318 | } |
| 1315 | kfree_skb(skb); | 1319 | kfree_skb(skb); |
| 1316 | 1320 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index dedbd76c033e..d80e34b8285f 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
| @@ -486,7 +486,7 @@ struct bnx2x_fastpath { | |||
| 486 | 486 | ||
| 487 | struct napi_struct napi; | 487 | struct napi_struct napi; |
| 488 | 488 | ||
| 489 | #ifdef CONFIG_NET_LL_RX_POLL | 489 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 490 | unsigned int state; | 490 | unsigned int state; |
| 491 | #define BNX2X_FP_STATE_IDLE 0 | 491 | #define BNX2X_FP_STATE_IDLE 0 |
| 492 | #define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */ | 492 | #define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */ |
| @@ -498,7 +498,7 @@ struct bnx2x_fastpath { | |||
| 498 | #define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD) | 498 | #define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD) |
| 499 | /* protect state */ | 499 | /* protect state */ |
| 500 | spinlock_t lock; | 500 | spinlock_t lock; |
| 501 | #endif /* CONFIG_NET_LL_RX_POLL */ | 501 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 502 | 502 | ||
| 503 | union host_hc_status_block status_blk; | 503 | union host_hc_status_block status_blk; |
| 504 | /* chip independent shortcuts into sb structure */ | 504 | /* chip independent shortcuts into sb structure */ |
| @@ -572,7 +572,7 @@ struct bnx2x_fastpath { | |||
| 572 | #define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index])) | 572 | #define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index])) |
| 573 | #define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats)) | 573 | #define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats)) |
| 574 | 574 | ||
| 575 | #ifdef CONFIG_NET_LL_RX_POLL | 575 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 576 | static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp) | 576 | static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp) |
| 577 | { | 577 | { |
| 578 | spin_lock_init(&fp->lock); | 578 | spin_lock_init(&fp->lock); |
| @@ -680,7 +680,7 @@ static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp) | |||
| 680 | { | 680 | { |
| 681 | return false; | 681 | return false; |
| 682 | } | 682 | } |
| 683 | #endif /* CONFIG_NET_LL_RX_POLL */ | 683 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 684 | 684 | ||
| 685 | /* Use 2500 as a mini-jumbo MTU for FCoE */ | 685 | /* Use 2500 as a mini-jumbo MTU for FCoE */ |
| 686 | #define BNX2X_FCOE_MINI_JUMBO_MTU 2500 | 686 | #define BNX2X_FCOE_MINI_JUMBO_MTU 2500 |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index ee350bde1818..f2d1ff10054b 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -3117,7 +3117,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget) | |||
| 3117 | return work_done; | 3117 | return work_done; |
| 3118 | } | 3118 | } |
| 3119 | 3119 | ||
| 3120 | #ifdef CONFIG_NET_LL_RX_POLL | 3120 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 3121 | /* must be called with local_bh_disable()d */ | 3121 | /* must be called with local_bh_disable()d */ |
| 3122 | int bnx2x_low_latency_recv(struct napi_struct *napi) | 3122 | int bnx2x_low_latency_recv(struct napi_struct *napi) |
| 3123 | { | 3123 | { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index e5da07858a2f..e06186c305d8 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -12026,7 +12026,7 @@ static const struct net_device_ops bnx2x_netdev_ops = { | |||
| 12026 | .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, | 12026 | .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, |
| 12027 | #endif | 12027 | #endif |
| 12028 | 12028 | ||
| 12029 | #ifdef CONFIG_NET_LL_RX_POLL | 12029 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 12030 | .ndo_busy_poll = bnx2x_low_latency_recv, | 12030 | .ndo_busy_poll = bnx2x_low_latency_recv, |
| 12031 | #endif | 12031 | #endif |
| 12032 | }; | 12032 | }; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 7be725cdfea8..a6494e5daffe 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
| @@ -54,7 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | #include <net/busy_poll.h> | 55 | #include <net/busy_poll.h> |
| 56 | 56 | ||
| 57 | #ifdef CONFIG_NET_LL_RX_POLL | 57 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 58 | #define LL_EXTENDED_STATS | 58 | #define LL_EXTENDED_STATS |
| 59 | #endif | 59 | #endif |
| 60 | /* common prefix used by pr_<> macros */ | 60 | /* common prefix used by pr_<> macros */ |
| @@ -366,7 +366,7 @@ struct ixgbe_q_vector { | |||
| 366 | struct rcu_head rcu; /* to avoid race with update stats on free */ | 366 | struct rcu_head rcu; /* to avoid race with update stats on free */ |
| 367 | char name[IFNAMSIZ + 9]; | 367 | char name[IFNAMSIZ + 9]; |
| 368 | 368 | ||
| 369 | #ifdef CONFIG_NET_LL_RX_POLL | 369 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 370 | unsigned int state; | 370 | unsigned int state; |
| 371 | #define IXGBE_QV_STATE_IDLE 0 | 371 | #define IXGBE_QV_STATE_IDLE 0 |
| 372 | #define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ | 372 | #define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ |
| @@ -377,12 +377,12 @@ struct ixgbe_q_vector { | |||
| 377 | #define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) | 377 | #define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) |
| 378 | #define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) | 378 | #define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) |
| 379 | spinlock_t lock; | 379 | spinlock_t lock; |
| 380 | #endif /* CONFIG_NET_LL_RX_POLL */ | 380 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 381 | 381 | ||
| 382 | /* for dynamic allocation of rings associated with this q_vector */ | 382 | /* for dynamic allocation of rings associated with this q_vector */ |
| 383 | struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp; | 383 | struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp; |
| 384 | }; | 384 | }; |
| 385 | #ifdef CONFIG_NET_LL_RX_POLL | 385 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 386 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) | 386 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) |
| 387 | { | 387 | { |
| 388 | 388 | ||
| @@ -462,7 +462,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector) | |||
| 462 | WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); | 462 | WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); |
| 463 | return q_vector->state & IXGBE_QV_USER_PEND; | 463 | return q_vector->state & IXGBE_QV_USER_PEND; |
| 464 | } | 464 | } |
| 465 | #else /* CONFIG_NET_LL_RX_POLL */ | 465 | #else /* CONFIG_NET_RX_BUSY_POLL */ |
| 466 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) | 466 | static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) |
| 467 | { | 467 | { |
| 468 | } | 468 | } |
| @@ -491,7 +491,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector) | |||
| 491 | { | 491 | { |
| 492 | return false; | 492 | return false; |
| 493 | } | 493 | } |
| 494 | #endif /* CONFIG_NET_LL_RX_POLL */ | 494 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 495 | 495 | ||
| 496 | #ifdef CONFIG_IXGBE_HWMON | 496 | #ifdef CONFIG_IXGBE_HWMON |
| 497 | 497 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index bad8f14b1941..be4b1fb3d0d2 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -1998,7 +1998,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
| 1998 | return total_rx_packets; | 1998 | return total_rx_packets; |
| 1999 | } | 1999 | } |
| 2000 | 2000 | ||
| 2001 | #ifdef CONFIG_NET_LL_RX_POLL | 2001 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 2002 | /* must be called with local_bh_disable()d */ | 2002 | /* must be called with local_bh_disable()d */ |
| 2003 | static int ixgbe_low_latency_recv(struct napi_struct *napi) | 2003 | static int ixgbe_low_latency_recv(struct napi_struct *napi) |
| 2004 | { | 2004 | { |
| @@ -2030,7 +2030,7 @@ static int ixgbe_low_latency_recv(struct napi_struct *napi) | |||
| 2030 | 2030 | ||
| 2031 | return found; | 2031 | return found; |
| 2032 | } | 2032 | } |
| 2033 | #endif /* CONFIG_NET_LL_RX_POLL */ | 2033 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 2034 | 2034 | ||
| 2035 | /** | 2035 | /** |
| 2036 | * ixgbe_configure_msix - Configure MSI-X hardware | 2036 | * ixgbe_configure_msix - Configure MSI-X hardware |
| @@ -7227,7 +7227,7 @@ static const struct net_device_ops ixgbe_netdev_ops = { | |||
| 7227 | #ifdef CONFIG_NET_POLL_CONTROLLER | 7227 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 7228 | .ndo_poll_controller = ixgbe_netpoll, | 7228 | .ndo_poll_controller = ixgbe_netpoll, |
| 7229 | #endif | 7229 | #endif |
| 7230 | #ifdef CONFIG_NET_LL_RX_POLL | 7230 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 7231 | .ndo_busy_poll = ixgbe_low_latency_recv, | 7231 | .ndo_busy_poll = ixgbe_low_latency_recv, |
| 7232 | #endif | 7232 | #endif |
| 7233 | #ifdef IXGBE_FCOE | 7233 | #ifdef IXGBE_FCOE |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index 727874f575ce..a28cd801a236 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
| @@ -223,7 +223,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset) | |||
| 223 | case ETH_SS_STATS: | 223 | case ETH_SS_STATS: |
| 224 | return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + | 224 | return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + |
| 225 | (priv->tx_ring_num * 2) + | 225 | (priv->tx_ring_num * 2) + |
| 226 | #ifdef CONFIG_NET_LL_RX_POLL | 226 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 227 | (priv->rx_ring_num * 5); | 227 | (priv->rx_ring_num * 5); |
| 228 | #else | 228 | #else |
| 229 | (priv->rx_ring_num * 2); | 229 | (priv->rx_ring_num * 2); |
| @@ -276,7 +276,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev, | |||
| 276 | for (i = 0; i < priv->rx_ring_num; i++) { | 276 | for (i = 0; i < priv->rx_ring_num; i++) { |
| 277 | data[index++] = priv->rx_ring[i].packets; | 277 | data[index++] = priv->rx_ring[i].packets; |
| 278 | data[index++] = priv->rx_ring[i].bytes; | 278 | data[index++] = priv->rx_ring[i].bytes; |
| 279 | #ifdef CONFIG_NET_LL_RX_POLL | 279 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 280 | data[index++] = priv->rx_ring[i].yields; | 280 | data[index++] = priv->rx_ring[i].yields; |
| 281 | data[index++] = priv->rx_ring[i].misses; | 281 | data[index++] = priv->rx_ring[i].misses; |
| 282 | data[index++] = priv->rx_ring[i].cleaned; | 282 | data[index++] = priv->rx_ring[i].cleaned; |
| @@ -344,7 +344,7 @@ static void mlx4_en_get_strings(struct net_device *dev, | |||
| 344 | "rx%d_packets", i); | 344 | "rx%d_packets", i); |
| 345 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 345 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
| 346 | "rx%d_bytes", i); | 346 | "rx%d_bytes", i); |
| 347 | #ifdef CONFIG_NET_LL_RX_POLL | 347 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 348 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 348 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
| 349 | "rx%d_napi_yield", i); | 349 | "rx%d_napi_yield", i); |
| 350 | sprintf(data + (index++) * ETH_GSTRING_LEN, | 350 | sprintf(data + (index++) * ETH_GSTRING_LEN, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 5eac871399d8..fa37b7a61213 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -68,7 +68,7 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up) | |||
| 68 | return 0; | 68 | return 0; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | #ifdef CONFIG_NET_LL_RX_POLL | 71 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 72 | /* must be called with local_bh_disable()d */ | 72 | /* must be called with local_bh_disable()d */ |
| 73 | static int mlx4_en_low_latency_recv(struct napi_struct *napi) | 73 | static int mlx4_en_low_latency_recv(struct napi_struct *napi) |
| 74 | { | 74 | { |
| @@ -94,7 +94,7 @@ static int mlx4_en_low_latency_recv(struct napi_struct *napi) | |||
| 94 | 94 | ||
| 95 | return done; | 95 | return done; |
| 96 | } | 96 | } |
| 97 | #endif /* CONFIG_NET_LL_RX_POLL */ | 97 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 98 | 98 | ||
| 99 | #ifdef CONFIG_RFS_ACCEL | 99 | #ifdef CONFIG_RFS_ACCEL |
| 100 | 100 | ||
| @@ -2140,7 +2140,7 @@ static const struct net_device_ops mlx4_netdev_ops = { | |||
| 2140 | #ifdef CONFIG_RFS_ACCEL | 2140 | #ifdef CONFIG_RFS_ACCEL |
| 2141 | .ndo_rx_flow_steer = mlx4_en_filter_rfs, | 2141 | .ndo_rx_flow_steer = mlx4_en_filter_rfs, |
| 2142 | #endif | 2142 | #endif |
| 2143 | #ifdef CONFIG_NET_LL_RX_POLL | 2143 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 2144 | .ndo_busy_poll = mlx4_en_low_latency_recv, | 2144 | .ndo_busy_poll = mlx4_en_low_latency_recv, |
| 2145 | #endif | 2145 | #endif |
| 2146 | }; | 2146 | }; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 8873d6802c80..6fc6dabc78d5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
| @@ -845,16 +845,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, | |||
| 845 | MLX4_CMD_NATIVE); | 845 | MLX4_CMD_NATIVE); |
| 846 | 846 | ||
| 847 | if (!err && dev->caps.function != slave) { | 847 | if (!err && dev->caps.function != slave) { |
| 848 | /* if config MAC in DB use it */ | 848 | def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; |
| 849 | if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac) | ||
| 850 | def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; | ||
| 851 | else { | ||
| 852 | /* set slave default_mac address */ | ||
| 853 | MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); | ||
| 854 | def_mac += slave << 8; | ||
| 855 | priv->mfunc.master.vf_admin[slave].vport[vhcr->in_modifier].mac = def_mac; | ||
| 856 | } | ||
| 857 | |||
| 858 | MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); | 849 | MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); |
| 859 | 850 | ||
| 860 | /* get port type - currently only eth is enabled */ | 851 | /* get port type - currently only eth is enabled */ |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index e85af922dcdc..36be3208786a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -371,7 +371,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
| 371 | 371 | ||
| 372 | dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; | 372 | dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; |
| 373 | 373 | ||
| 374 | if (!enable_64b_cqe_eqe) { | 374 | if (!enable_64b_cqe_eqe && !mlx4_is_slave(dev)) { |
| 375 | if (dev_cap->flags & | 375 | if (dev_cap->flags & |
| 376 | (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { | 376 | (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { |
| 377 | mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); | 377 | mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 35fb60e2320c..5e0aa569306a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -292,7 +292,7 @@ struct mlx4_en_rx_ring { | |||
| 292 | void *rx_info; | 292 | void *rx_info; |
| 293 | unsigned long bytes; | 293 | unsigned long bytes; |
| 294 | unsigned long packets; | 294 | unsigned long packets; |
| 295 | #ifdef CONFIG_NET_LL_RX_POLL | 295 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 296 | unsigned long yields; | 296 | unsigned long yields; |
| 297 | unsigned long misses; | 297 | unsigned long misses; |
| 298 | unsigned long cleaned; | 298 | unsigned long cleaned; |
| @@ -318,7 +318,7 @@ struct mlx4_en_cq { | |||
| 318 | struct mlx4_cqe *buf; | 318 | struct mlx4_cqe *buf; |
| 319 | #define MLX4_EN_OPCODE_ERROR 0x1e | 319 | #define MLX4_EN_OPCODE_ERROR 0x1e |
| 320 | 320 | ||
| 321 | #ifdef CONFIG_NET_LL_RX_POLL | 321 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 322 | unsigned int state; | 322 | unsigned int state; |
| 323 | #define MLX4_EN_CQ_STATE_IDLE 0 | 323 | #define MLX4_EN_CQ_STATE_IDLE 0 |
| 324 | #define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */ | 324 | #define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */ |
| @@ -329,7 +329,7 @@ struct mlx4_en_cq { | |||
| 329 | #define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD) | 329 | #define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD) |
| 330 | #define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD) | 330 | #define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD) |
| 331 | spinlock_t poll_lock; /* protects from LLS/napi conflicts */ | 331 | spinlock_t poll_lock; /* protects from LLS/napi conflicts */ |
| 332 | #endif /* CONFIG_NET_LL_RX_POLL */ | 332 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 333 | }; | 333 | }; |
| 334 | 334 | ||
| 335 | struct mlx4_en_port_profile { | 335 | struct mlx4_en_port_profile { |
| @@ -580,7 +580,7 @@ struct mlx4_mac_entry { | |||
| 580 | struct rcu_head rcu; | 580 | struct rcu_head rcu; |
| 581 | }; | 581 | }; |
| 582 | 582 | ||
| 583 | #ifdef CONFIG_NET_LL_RX_POLL | 583 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 584 | static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq) | 584 | static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq) |
| 585 | { | 585 | { |
| 586 | spin_lock_init(&cq->poll_lock); | 586 | spin_lock_init(&cq->poll_lock); |
| @@ -687,7 +687,7 @@ static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq) | |||
| 687 | { | 687 | { |
| 688 | return false; | 688 | return false; |
| 689 | } | 689 | } |
| 690 | #endif /* CONFIG_NET_LL_RX_POLL */ | 690 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
| 691 | 691 | ||
| 692 | #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) | 692 | #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) |
| 693 | 693 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index f4bb8f5d7453..221645e9f182 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
| @@ -1400,8 +1400,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64); | |||
| 1400 | #define ADDR_IN_RANGE(addr, low, high) \ | 1400 | #define ADDR_IN_RANGE(addr, low, high) \ |
| 1401 | (((addr) < (high)) && ((addr) >= (low))) | 1401 | (((addr) < (high)) && ((addr) >= (low))) |
| 1402 | 1402 | ||
| 1403 | #define QLCRD32(adapter, off) \ | 1403 | #define QLCRD32(adapter, off, err) \ |
| 1404 | (adapter->ahw->hw_ops->read_reg)(adapter, off) | 1404 | (adapter->ahw->hw_ops->read_reg)(adapter, off, err) |
| 1405 | 1405 | ||
| 1406 | #define QLCWR32(adapter, off, val) \ | 1406 | #define QLCWR32(adapter, off, val) \ |
| 1407 | adapter->ahw->hw_ops->write_reg(adapter, off, val) | 1407 | adapter->ahw->hw_ops->write_reg(adapter, off, val) |
| @@ -1604,7 +1604,7 @@ struct qlcnic_nic_template { | |||
| 1604 | struct qlcnic_hardware_ops { | 1604 | struct qlcnic_hardware_ops { |
| 1605 | void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); | 1605 | void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); |
| 1606 | void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); | 1606 | void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); |
| 1607 | int (*read_reg) (struct qlcnic_adapter *, ulong); | 1607 | int (*read_reg) (struct qlcnic_adapter *, ulong, int *); |
| 1608 | int (*write_reg) (struct qlcnic_adapter *, ulong, u32); | 1608 | int (*write_reg) (struct qlcnic_adapter *, ulong, u32); |
| 1609 | void (*get_ocm_win) (struct qlcnic_hardware_context *); | 1609 | void (*get_ocm_win) (struct qlcnic_hardware_context *); |
| 1610 | int (*get_mac_address) (struct qlcnic_adapter *, u8 *); | 1610 | int (*get_mac_address) (struct qlcnic_adapter *, u8 *); |
| @@ -1662,12 +1662,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 1662 | adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size); | 1662 | adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size); |
| 1663 | } | 1663 | } |
| 1664 | 1664 | ||
| 1665 | static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter, | ||
| 1666 | ulong off) | ||
| 1667 | { | ||
| 1668 | return adapter->ahw->hw_ops->read_reg(adapter, off); | ||
| 1669 | } | ||
| 1670 | |||
| 1671 | static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter, | 1665 | static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter, |
| 1672 | ulong off, u32 data) | 1666 | ulong off, u32 data) |
| 1673 | { | 1667 | { |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index bc483e1881a3..92da9980a0a0 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
| @@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr) | |||
| 228 | return 0; | 228 | return 0; |
| 229 | } | 229 | } |
| 230 | 230 | ||
| 231 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr) | 231 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr, |
| 232 | int *err) | ||
| 232 | { | 233 | { |
| 233 | int ret; | ||
| 234 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 234 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 235 | 235 | ||
| 236 | ret = __qlcnic_set_win_base(adapter, (u32) addr); | 236 | *err = __qlcnic_set_win_base(adapter, (u32) addr); |
| 237 | if (!ret) { | 237 | if (!*err) { |
| 238 | return QLCRDX(ahw, QLCNIC_WILDCARD); | 238 | return QLCRDX(ahw, QLCNIC_WILDCARD); |
| 239 | } else { | 239 | } else { |
| 240 | dev_err(&adapter->pdev->dev, | 240 | dev_err(&adapter->pdev->dev, |
| 241 | "%s failed, addr = 0x%x\n", __func__, (int)addr); | 241 | "%s failed, addr = 0x%lx\n", __func__, addr); |
| 242 | return -EIO; | 242 | return -EIO; |
| 243 | } | 243 | } |
| 244 | } | 244 | } |
| @@ -561,7 +561,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter) | |||
| 561 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | 561 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, |
| 562 | loff_t offset, size_t size) | 562 | loff_t offset, size_t size) |
| 563 | { | 563 | { |
| 564 | int ret; | 564 | int ret = 0; |
| 565 | u32 data; | 565 | u32 data; |
| 566 | 566 | ||
| 567 | if (qlcnic_api_lock(adapter)) { | 567 | if (qlcnic_api_lock(adapter)) { |
| @@ -571,7 +571,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 571 | return; | 571 | return; |
| 572 | } | 572 | } |
| 573 | 573 | ||
| 574 | ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset); | 574 | data = QLCRD32(adapter, (u32) offset, &ret); |
| 575 | qlcnic_api_unlock(adapter); | 575 | qlcnic_api_unlock(adapter); |
| 576 | 576 | ||
| 577 | if (ret == -EIO) { | 577 | if (ret == -EIO) { |
| @@ -580,7 +580,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 580 | __func__, (u32)offset); | 580 | __func__, (u32)offset); |
| 581 | return; | 581 | return; |
| 582 | } | 582 | } |
| 583 | data = ret; | ||
| 584 | memcpy(buf, &data, size); | 583 | memcpy(buf, &data, size); |
| 585 | } | 584 | } |
| 586 | 585 | ||
| @@ -2075,18 +2074,25 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) | |||
| 2075 | static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, | 2074 | static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, |
| 2076 | u32 data[]) | 2075 | u32 data[]) |
| 2077 | { | 2076 | { |
| 2077 | struct qlcnic_hardware_context *ahw = adapter->ahw; | ||
| 2078 | u8 link_status, duplex; | 2078 | u8 link_status, duplex; |
| 2079 | /* link speed */ | 2079 | /* link speed */ |
| 2080 | link_status = LSB(data[3]) & 1; | 2080 | link_status = LSB(data[3]) & 1; |
| 2081 | adapter->ahw->link_speed = MSW(data[2]); | 2081 | if (link_status) { |
| 2082 | adapter->ahw->link_autoneg = MSB(MSW(data[3])); | 2082 | ahw->link_speed = MSW(data[2]); |
| 2083 | adapter->ahw->module_type = MSB(LSW(data[3])); | 2083 | duplex = LSB(MSW(data[3])); |
| 2084 | duplex = LSB(MSW(data[3])); | 2084 | if (duplex) |
| 2085 | if (duplex) | 2085 | ahw->link_duplex = DUPLEX_FULL; |
| 2086 | adapter->ahw->link_duplex = DUPLEX_FULL; | 2086 | else |
| 2087 | else | 2087 | ahw->link_duplex = DUPLEX_HALF; |
| 2088 | adapter->ahw->link_duplex = DUPLEX_HALF; | 2088 | } else { |
| 2089 | adapter->ahw->has_link_events = 1; | 2089 | ahw->link_speed = SPEED_UNKNOWN; |
| 2090 | ahw->link_duplex = DUPLEX_UNKNOWN; | ||
| 2091 | } | ||
| 2092 | |||
| 2093 | ahw->link_autoneg = MSB(MSW(data[3])); | ||
| 2094 | ahw->module_type = MSB(LSW(data[3])); | ||
| 2095 | ahw->has_link_events = 1; | ||
| 2090 | qlcnic_advert_link_change(adapter, link_status); | 2096 | qlcnic_advert_link_change(adapter, link_status); |
| 2091 | } | 2097 | } |
| 2092 | 2098 | ||
| @@ -2384,9 +2390,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, | |||
| 2384 | u32 flash_addr, u8 *p_data, | 2390 | u32 flash_addr, u8 *p_data, |
| 2385 | int count) | 2391 | int count) |
| 2386 | { | 2392 | { |
| 2387 | int i, ret; | 2393 | u32 word, range, flash_offset, addr = flash_addr, ret; |
| 2388 | u32 word, range, flash_offset, addr = flash_addr; | ||
| 2389 | ulong indirect_add, direct_window; | 2394 | ulong indirect_add, direct_window; |
| 2395 | int i, err = 0; | ||
| 2390 | 2396 | ||
| 2391 | flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); | 2397 | flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); |
| 2392 | if (addr & 0x3) { | 2398 | if (addr & 0x3) { |
| @@ -2404,10 +2410,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, | |||
| 2404 | /* Multi sector read */ | 2410 | /* Multi sector read */ |
| 2405 | for (i = 0; i < count; i++) { | 2411 | for (i = 0; i < count; i++) { |
| 2406 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); | 2412 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); |
| 2407 | ret = qlcnic_83xx_rd_reg_indirect(adapter, | 2413 | ret = QLCRD32(adapter, indirect_add, &err); |
| 2408 | indirect_add); | 2414 | if (err == -EIO) |
| 2409 | if (ret == -EIO) | 2415 | return err; |
| 2410 | return -EIO; | ||
| 2411 | 2416 | ||
| 2412 | word = ret; | 2417 | word = ret; |
| 2413 | *(u32 *)p_data = word; | 2418 | *(u32 *)p_data = word; |
| @@ -2428,10 +2433,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter, | |||
| 2428 | /* Single sector read */ | 2433 | /* Single sector read */ |
| 2429 | for (i = 0; i < count; i++) { | 2434 | for (i = 0; i < count; i++) { |
| 2430 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); | 2435 | indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); |
| 2431 | ret = qlcnic_83xx_rd_reg_indirect(adapter, | 2436 | ret = QLCRD32(adapter, indirect_add, &err); |
| 2432 | indirect_add); | 2437 | if (err == -EIO) |
| 2433 | if (ret == -EIO) | 2438 | return err; |
| 2434 | return -EIO; | ||
| 2435 | 2439 | ||
| 2436 | word = ret; | 2440 | word = ret; |
| 2437 | *(u32 *)p_data = word; | 2441 | *(u32 *)p_data = word; |
| @@ -2447,10 +2451,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter) | |||
| 2447 | { | 2451 | { |
| 2448 | u32 status; | 2452 | u32 status; |
| 2449 | int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; | 2453 | int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; |
| 2454 | int err = 0; | ||
| 2450 | 2455 | ||
| 2451 | do { | 2456 | do { |
| 2452 | status = qlcnic_83xx_rd_reg_indirect(adapter, | 2457 | status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err); |
| 2453 | QLC_83XX_FLASH_STATUS); | 2458 | if (err == -EIO) |
| 2459 | return err; | ||
| 2460 | |||
| 2454 | if ((status & QLC_83XX_FLASH_STATUS_READY) == | 2461 | if ((status & QLC_83XX_FLASH_STATUS_READY) == |
| 2455 | QLC_83XX_FLASH_STATUS_READY) | 2462 | QLC_83XX_FLASH_STATUS_READY) |
| 2456 | break; | 2463 | break; |
| @@ -2502,7 +2509,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter) | |||
| 2502 | 2509 | ||
| 2503 | int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) | 2510 | int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) |
| 2504 | { | 2511 | { |
| 2505 | int ret, mfg_id; | 2512 | int ret, err = 0; |
| 2513 | u32 mfg_id; | ||
| 2506 | 2514 | ||
| 2507 | if (qlcnic_83xx_lock_flash(adapter)) | 2515 | if (qlcnic_83xx_lock_flash(adapter)) |
| 2508 | return -EIO; | 2516 | return -EIO; |
| @@ -2517,9 +2525,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) | |||
| 2517 | return -EIO; | 2525 | return -EIO; |
| 2518 | } | 2526 | } |
| 2519 | 2527 | ||
| 2520 | mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); | 2528 | mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err); |
| 2521 | if (mfg_id == -EIO) | 2529 | if (err == -EIO) { |
| 2522 | return -EIO; | 2530 | qlcnic_83xx_unlock_flash(adapter); |
| 2531 | return err; | ||
| 2532 | } | ||
| 2523 | 2533 | ||
| 2524 | adapter->flash_mfg_id = (mfg_id & 0xFF); | 2534 | adapter->flash_mfg_id = (mfg_id & 0xFF); |
| 2525 | qlcnic_83xx_unlock_flash(adapter); | 2535 | qlcnic_83xx_unlock_flash(adapter); |
| @@ -2636,7 +2646,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, | |||
| 2636 | u32 *p_data, int count) | 2646 | u32 *p_data, int count) |
| 2637 | { | 2647 | { |
| 2638 | u32 temp; | 2648 | u32 temp; |
| 2639 | int ret = -EIO; | 2649 | int ret = -EIO, err = 0; |
| 2640 | 2650 | ||
| 2641 | if ((count < QLC_83XX_FLASH_WRITE_MIN) || | 2651 | if ((count < QLC_83XX_FLASH_WRITE_MIN) || |
| 2642 | (count > QLC_83XX_FLASH_WRITE_MAX)) { | 2652 | (count > QLC_83XX_FLASH_WRITE_MAX)) { |
| @@ -2645,8 +2655,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, | |||
| 2645 | return -EIO; | 2655 | return -EIO; |
| 2646 | } | 2656 | } |
| 2647 | 2657 | ||
| 2648 | temp = qlcnic_83xx_rd_reg_indirect(adapter, | 2658 | temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err); |
| 2649 | QLC_83XX_FLASH_SPI_CONTROL); | 2659 | if (err == -EIO) |
| 2660 | return err; | ||
| 2661 | |||
| 2650 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, | 2662 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, |
| 2651 | (temp | QLC_83XX_FLASH_SPI_CTRL)); | 2663 | (temp | QLC_83XX_FLASH_SPI_CTRL)); |
| 2652 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, | 2664 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, |
| @@ -2695,13 +2707,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr, | |||
| 2695 | return -EIO; | 2707 | return -EIO; |
| 2696 | } | 2708 | } |
| 2697 | 2709 | ||
| 2698 | ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS); | 2710 | ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err); |
| 2711 | if (err == -EIO) | ||
| 2712 | return err; | ||
| 2713 | |||
| 2699 | if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { | 2714 | if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { |
| 2700 | dev_err(&adapter->pdev->dev, "%s: failed at %d\n", | 2715 | dev_err(&adapter->pdev->dev, "%s: failed at %d\n", |
| 2701 | __func__, __LINE__); | 2716 | __func__, __LINE__); |
| 2702 | /* Operation failed, clear error bit */ | 2717 | /* Operation failed, clear error bit */ |
| 2703 | temp = qlcnic_83xx_rd_reg_indirect(adapter, | 2718 | temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err); |
| 2704 | QLC_83XX_FLASH_SPI_CONTROL); | 2719 | if (err == -EIO) |
| 2720 | return err; | ||
| 2721 | |||
| 2705 | qlcnic_83xx_wrt_reg_indirect(adapter, | 2722 | qlcnic_83xx_wrt_reg_indirect(adapter, |
| 2706 | QLC_83XX_FLASH_SPI_CONTROL, | 2723 | QLC_83XX_FLASH_SPI_CONTROL, |
| 2707 | (temp | QLC_83XX_FLASH_SPI_CTRL)); | 2724 | (temp | QLC_83XX_FLASH_SPI_CTRL)); |
| @@ -2823,6 +2840,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, | |||
| 2823 | { | 2840 | { |
| 2824 | int i, j, ret = 0; | 2841 | int i, j, ret = 0; |
| 2825 | u32 temp; | 2842 | u32 temp; |
| 2843 | int err = 0; | ||
| 2826 | 2844 | ||
| 2827 | /* Check alignment */ | 2845 | /* Check alignment */ |
| 2828 | if (addr & 0xF) | 2846 | if (addr & 0xF) |
| @@ -2855,8 +2873,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, | |||
| 2855 | QLCNIC_TA_WRITE_START); | 2873 | QLCNIC_TA_WRITE_START); |
| 2856 | 2874 | ||
| 2857 | for (j = 0; j < MAX_CTL_CHECK; j++) { | 2875 | for (j = 0; j < MAX_CTL_CHECK; j++) { |
| 2858 | temp = qlcnic_83xx_rd_reg_indirect(adapter, | 2876 | temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err); |
| 2859 | QLCNIC_MS_CTRL); | 2877 | if (err == -EIO) { |
| 2878 | mutex_unlock(&adapter->ahw->mem_lock); | ||
| 2879 | return err; | ||
| 2880 | } | ||
| 2881 | |||
| 2860 | if ((temp & TA_CTL_BUSY) == 0) | 2882 | if ((temp & TA_CTL_BUSY) == 0) |
| 2861 | break; | 2883 | break; |
| 2862 | } | 2884 | } |
| @@ -2878,9 +2900,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr, | |||
| 2878 | int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, | 2900 | int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, |
| 2879 | u8 *p_data, int count) | 2901 | u8 *p_data, int count) |
| 2880 | { | 2902 | { |
| 2881 | int i, ret; | 2903 | u32 word, addr = flash_addr, ret; |
| 2882 | u32 word, addr = flash_addr; | ||
| 2883 | ulong indirect_addr; | 2904 | ulong indirect_addr; |
| 2905 | int i, err = 0; | ||
| 2884 | 2906 | ||
| 2885 | if (qlcnic_83xx_lock_flash(adapter) != 0) | 2907 | if (qlcnic_83xx_lock_flash(adapter) != 0) |
| 2886 | return -EIO; | 2908 | return -EIO; |
| @@ -2900,10 +2922,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, | |||
| 2900 | } | 2922 | } |
| 2901 | 2923 | ||
| 2902 | indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); | 2924 | indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); |
| 2903 | ret = qlcnic_83xx_rd_reg_indirect(adapter, | 2925 | ret = QLCRD32(adapter, indirect_addr, &err); |
| 2904 | indirect_addr); | 2926 | if (err == -EIO) |
| 2905 | if (ret == -EIO) | 2927 | return err; |
| 2906 | return -EIO; | 2928 | |
| 2907 | word = ret; | 2929 | word = ret; |
| 2908 | *(u32 *)p_data = word; | 2930 | *(u32 *)p_data = word; |
| 2909 | p_data = p_data + 4; | 2931 | p_data = p_data + 4; |
| @@ -3369,7 +3391,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter, | |||
| 3369 | 3391 | ||
| 3370 | static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) | 3392 | static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) |
| 3371 | { | 3393 | { |
| 3372 | int ret; | 3394 | int ret, err = 0; |
| 3395 | u32 temp; | ||
| 3373 | 3396 | ||
| 3374 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, | 3397 | qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, |
| 3375 | QLC_83XX_FLASH_OEM_READ_SIG); | 3398 | QLC_83XX_FLASH_OEM_READ_SIG); |
| @@ -3379,8 +3402,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) | |||
| 3379 | if (ret) | 3402 | if (ret) |
| 3380 | return -EIO; | 3403 | return -EIO; |
| 3381 | 3404 | ||
| 3382 | ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); | 3405 | temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err); |
| 3383 | return ret & 0xFF; | 3406 | if (err == -EIO) |
| 3407 | return err; | ||
| 3408 | |||
| 3409 | return temp & 0xFF; | ||
| 3384 | } | 3410 | } |
| 3385 | 3411 | ||
| 3386 | int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) | 3412 | int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h index 2548d1403d75..272f56a2e14b 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | |||
| @@ -508,7 +508,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *); | |||
| 508 | void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *); | 508 | void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *); |
| 509 | void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t); | 509 | void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t); |
| 510 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t); | 510 | void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t); |
| 511 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong); | 511 | int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *); |
| 512 | int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32); | 512 | int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32); |
| 513 | void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []); | 513 | void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []); |
| 514 | int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32); | 514 | int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c index 51ab4b56fc91..9f4b8d5f0865 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c | |||
| @@ -1303,8 +1303,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1303 | { | 1303 | { |
| 1304 | int i, j; | 1304 | int i, j; |
| 1305 | u32 val = 0, val1 = 0, reg = 0; | 1305 | u32 val = 0, val1 = 0, reg = 0; |
| 1306 | int err = 0; | ||
| 1306 | 1307 | ||
| 1307 | val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG); | 1308 | val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err); |
| 1309 | if (err == -EIO) | ||
| 1310 | return; | ||
| 1308 | dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); | 1311 | dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); |
| 1309 | 1312 | ||
| 1310 | for (j = 0; j < 2; j++) { | 1313 | for (j = 0; j < 2; j++) { |
| @@ -1318,7 +1321,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1318 | reg = QLC_83XX_PORT1_THRESHOLD; | 1321 | reg = QLC_83XX_PORT1_THRESHOLD; |
| 1319 | } | 1322 | } |
| 1320 | for (i = 0; i < 8; i++) { | 1323 | for (i = 0; i < 8; i++) { |
| 1321 | val = QLCRD32(adapter, reg + (i * 0x4)); | 1324 | val = QLCRD32(adapter, reg + (i * 0x4), &err); |
| 1325 | if (err == -EIO) | ||
| 1326 | return; | ||
| 1322 | dev_info(&adapter->pdev->dev, "0x%x ", val); | 1327 | dev_info(&adapter->pdev->dev, "0x%x ", val); |
| 1323 | } | 1328 | } |
| 1324 | dev_info(&adapter->pdev->dev, "\n"); | 1329 | dev_info(&adapter->pdev->dev, "\n"); |
| @@ -1335,8 +1340,10 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1335 | reg = QLC_83XX_PORT1_TC_MC_REG; | 1340 | reg = QLC_83XX_PORT1_TC_MC_REG; |
| 1336 | } | 1341 | } |
| 1337 | for (i = 0; i < 4; i++) { | 1342 | for (i = 0; i < 4; i++) { |
| 1338 | val = QLCRD32(adapter, reg + (i * 0x4)); | 1343 | val = QLCRD32(adapter, reg + (i * 0x4), &err); |
| 1339 | dev_info(&adapter->pdev->dev, "0x%x ", val); | 1344 | if (err == -EIO) |
| 1345 | return; | ||
| 1346 | dev_info(&adapter->pdev->dev, "0x%x ", val); | ||
| 1340 | } | 1347 | } |
| 1341 | dev_info(&adapter->pdev->dev, "\n"); | 1348 | dev_info(&adapter->pdev->dev, "\n"); |
| 1342 | } | 1349 | } |
| @@ -1352,17 +1359,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter) | |||
| 1352 | reg = QLC_83XX_PORT1_TC_STATS; | 1359 | reg = QLC_83XX_PORT1_TC_STATS; |
| 1353 | } | 1360 | } |
| 1354 | for (i = 7; i >= 0; i--) { | 1361 | for (i = 7; i >= 0; i--) { |
| 1355 | val = QLCRD32(adapter, reg); | 1362 | val = QLCRD32(adapter, reg, &err); |
| 1363 | if (err == -EIO) | ||
| 1364 | return; | ||
| 1356 | val &= ~(0x7 << 29); /* Reset bits 29 to 31 */ | 1365 | val &= ~(0x7 << 29); /* Reset bits 29 to 31 */ |
| 1357 | QLCWR32(adapter, reg, (val | (i << 29))); | 1366 | QLCWR32(adapter, reg, (val | (i << 29))); |
| 1358 | val = QLCRD32(adapter, reg); | 1367 | val = QLCRD32(adapter, reg, &err); |
| 1368 | if (err == -EIO) | ||
| 1369 | return; | ||
| 1359 | dev_info(&adapter->pdev->dev, "0x%x ", val); | 1370 | dev_info(&adapter->pdev->dev, "0x%x ", val); |
| 1360 | } | 1371 | } |
| 1361 | dev_info(&adapter->pdev->dev, "\n"); | 1372 | dev_info(&adapter->pdev->dev, "\n"); |
| 1362 | } | 1373 | } |
| 1363 | 1374 | ||
| 1364 | val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD); | 1375 | val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err); |
| 1365 | val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD); | 1376 | if (err == -EIO) |
| 1377 | return; | ||
| 1378 | val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err); | ||
| 1379 | if (err == -EIO) | ||
| 1380 | return; | ||
| 1366 | dev_info(&adapter->pdev->dev, | 1381 | dev_info(&adapter->pdev->dev, |
| 1367 | "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n", | 1382 | "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n", |
| 1368 | val, val1); | 1383 | val, val1); |
| @@ -1425,7 +1440,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter) | |||
| 1425 | static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) | 1440 | static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) |
| 1426 | { | 1441 | { |
| 1427 | u32 heartbeat, peg_status; | 1442 | u32 heartbeat, peg_status; |
| 1428 | int retries, ret = -EIO; | 1443 | int retries, ret = -EIO, err = 0; |
| 1429 | 1444 | ||
| 1430 | retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT; | 1445 | retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT; |
| 1431 | p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev, | 1446 | p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev, |
| @@ -1453,11 +1468,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) | |||
| 1453 | "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n" | 1468 | "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n" |
| 1454 | "PEG_NET_4_PC: 0x%x\n", peg_status, | 1469 | "PEG_NET_4_PC: 0x%x\n", peg_status, |
| 1455 | QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2), | 1470 | QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2), |
| 1456 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0), | 1471 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err), |
| 1457 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1), | 1472 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err), |
| 1458 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2), | 1473 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err), |
| 1459 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3), | 1474 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err), |
| 1460 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4)); | 1475 | QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err)); |
| 1461 | 1476 | ||
| 1462 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) | 1477 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) |
| 1463 | dev_err(&p_dev->pdev->dev, | 1478 | dev_err(&p_dev->pdev->dev, |
| @@ -1501,18 +1516,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev) | |||
| 1501 | static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr, | 1516 | static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr, |
| 1502 | int duration, u32 mask, u32 status) | 1517 | int duration, u32 mask, u32 status) |
| 1503 | { | 1518 | { |
| 1519 | int timeout_error, err = 0; | ||
| 1504 | u32 value; | 1520 | u32 value; |
| 1505 | int timeout_error; | ||
| 1506 | u8 retries; | 1521 | u8 retries; |
| 1507 | 1522 | ||
| 1508 | value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); | 1523 | value = QLCRD32(p_dev, addr, &err); |
| 1524 | if (err == -EIO) | ||
| 1525 | return err; | ||
| 1509 | retries = duration / 10; | 1526 | retries = duration / 10; |
| 1510 | 1527 | ||
| 1511 | do { | 1528 | do { |
| 1512 | if ((value & mask) != status) { | 1529 | if ((value & mask) != status) { |
| 1513 | timeout_error = 1; | 1530 | timeout_error = 1; |
| 1514 | msleep(duration / 10); | 1531 | msleep(duration / 10); |
| 1515 | value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); | 1532 | value = QLCRD32(p_dev, addr, &err); |
| 1533 | if (err == -EIO) | ||
| 1534 | return err; | ||
| 1516 | } else { | 1535 | } else { |
| 1517 | timeout_error = 0; | 1536 | timeout_error = 0; |
| 1518 | break; | 1537 | break; |
| @@ -1606,9 +1625,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev) | |||
| 1606 | static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev, | 1625 | static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev, |
| 1607 | u32 raddr, u32 waddr) | 1626 | u32 raddr, u32 waddr) |
| 1608 | { | 1627 | { |
| 1609 | int value; | 1628 | int err = 0; |
| 1629 | u32 value; | ||
| 1610 | 1630 | ||
| 1611 | value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); | 1631 | value = QLCRD32(p_dev, raddr, &err); |
| 1632 | if (err == -EIO) | ||
| 1633 | return; | ||
| 1612 | qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value); | 1634 | qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value); |
| 1613 | } | 1635 | } |
| 1614 | 1636 | ||
| @@ -1617,12 +1639,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev, | |||
| 1617 | u32 raddr, u32 waddr, | 1639 | u32 raddr, u32 waddr, |
| 1618 | struct qlc_83xx_rmw *p_rmw_hdr) | 1640 | struct qlc_83xx_rmw *p_rmw_hdr) |
| 1619 | { | 1641 | { |
| 1620 | int value; | 1642 | int err = 0; |
| 1643 | u32 value; | ||
| 1621 | 1644 | ||
| 1622 | if (p_rmw_hdr->index_a) | 1645 | if (p_rmw_hdr->index_a) { |
| 1623 | value = p_dev->ahw->reset.array[p_rmw_hdr->index_a]; | 1646 | value = p_dev->ahw->reset.array[p_rmw_hdr->index_a]; |
| 1624 | else | 1647 | } else { |
| 1625 | value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); | 1648 | value = QLCRD32(p_dev, raddr, &err); |
| 1649 | if (err == -EIO) | ||
| 1650 | return; | ||
| 1651 | } | ||
| 1626 | 1652 | ||
| 1627 | value &= p_rmw_hdr->mask; | 1653 | value &= p_rmw_hdr->mask; |
| 1628 | value <<= p_rmw_hdr->shl; | 1654 | value <<= p_rmw_hdr->shl; |
| @@ -1675,7 +1701,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev, | |||
| 1675 | long delay; | 1701 | long delay; |
| 1676 | struct qlc_83xx_entry *entry; | 1702 | struct qlc_83xx_entry *entry; |
| 1677 | struct qlc_83xx_poll *poll; | 1703 | struct qlc_83xx_poll *poll; |
| 1678 | int i; | 1704 | int i, err = 0; |
| 1679 | unsigned long arg1, arg2; | 1705 | unsigned long arg1, arg2; |
| 1680 | 1706 | ||
| 1681 | poll = (struct qlc_83xx_poll *)((char *)p_hdr + | 1707 | poll = (struct qlc_83xx_poll *)((char *)p_hdr + |
| @@ -1699,10 +1725,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev, | |||
| 1699 | arg1, delay, | 1725 | arg1, delay, |
| 1700 | poll->mask, | 1726 | poll->mask, |
| 1701 | poll->status)){ | 1727 | poll->status)){ |
| 1702 | qlcnic_83xx_rd_reg_indirect(p_dev, | 1728 | QLCRD32(p_dev, arg1, &err); |
| 1703 | arg1); | 1729 | if (err == -EIO) |
| 1704 | qlcnic_83xx_rd_reg_indirect(p_dev, | 1730 | return; |
| 1705 | arg2); | 1731 | QLCRD32(p_dev, arg2, &err); |
| 1732 | if (err == -EIO) | ||
| 1733 | return; | ||
| 1706 | } | 1734 | } |
| 1707 | } | 1735 | } |
| 1708 | } | 1736 | } |
| @@ -1768,7 +1796,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev, | |||
| 1768 | struct qlc_83xx_entry_hdr *p_hdr) | 1796 | struct qlc_83xx_entry_hdr *p_hdr) |
| 1769 | { | 1797 | { |
| 1770 | long delay; | 1798 | long delay; |
| 1771 | int index, i, j; | 1799 | int index, i, j, err; |
| 1772 | struct qlc_83xx_quad_entry *entry; | 1800 | struct qlc_83xx_quad_entry *entry; |
| 1773 | struct qlc_83xx_poll *poll; | 1801 | struct qlc_83xx_poll *poll; |
| 1774 | unsigned long addr; | 1802 | unsigned long addr; |
| @@ -1788,7 +1816,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev, | |||
| 1788 | poll->mask, poll->status)){ | 1816 | poll->mask, poll->status)){ |
| 1789 | index = p_dev->ahw->reset.array_index; | 1817 | index = p_dev->ahw->reset.array_index; |
| 1790 | addr = entry->dr_addr; | 1818 | addr = entry->dr_addr; |
| 1791 | j = qlcnic_83xx_rd_reg_indirect(p_dev, addr); | 1819 | j = QLCRD32(p_dev, addr, &err); |
| 1820 | if (err == -EIO) | ||
| 1821 | return; | ||
| 1822 | |||
| 1792 | p_dev->ahw->reset.array[index++] = j; | 1823 | p_dev->ahw->reset.array[index++] = j; |
| 1793 | 1824 | ||
| 1794 | if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES) | 1825 | if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c index 0581a484ceb5..d09389b33474 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c | |||
| @@ -104,7 +104,7 @@ static u32 | |||
| 104 | qlcnic_poll_rsp(struct qlcnic_adapter *adapter) | 104 | qlcnic_poll_rsp(struct qlcnic_adapter *adapter) |
| 105 | { | 105 | { |
| 106 | u32 rsp; | 106 | u32 rsp; |
| 107 | int timeout = 0; | 107 | int timeout = 0, err = 0; |
| 108 | 108 | ||
| 109 | do { | 109 | do { |
| 110 | /* give atleast 1ms for firmware to respond */ | 110 | /* give atleast 1ms for firmware to respond */ |
| @@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter) | |||
| 113 | if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT) | 113 | if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT) |
| 114 | return QLCNIC_CDRP_RSP_TIMEOUT; | 114 | return QLCNIC_CDRP_RSP_TIMEOUT; |
| 115 | 115 | ||
| 116 | rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET); | 116 | rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err); |
| 117 | } while (!QLCNIC_CDRP_IS_RSP(rsp)); | 117 | } while (!QLCNIC_CDRP_IS_RSP(rsp)); |
| 118 | 118 | ||
| 119 | return rsp; | 119 | return rsp; |
| @@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter) | |||
| 122 | int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, | 122 | int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, |
| 123 | struct qlcnic_cmd_args *cmd) | 123 | struct qlcnic_cmd_args *cmd) |
| 124 | { | 124 | { |
| 125 | int i; | 125 | int i, err = 0; |
| 126 | u32 rsp; | 126 | u32 rsp; |
| 127 | u32 signature; | 127 | u32 signature; |
| 128 | struct pci_dev *pdev = adapter->pdev; | 128 | struct pci_dev *pdev = adapter->pdev; |
| @@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, | |||
| 148 | dev_err(&pdev->dev, "card response timeout.\n"); | 148 | dev_err(&pdev->dev, "card response timeout.\n"); |
| 149 | cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT; | 149 | cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT; |
| 150 | } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { | 150 | } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { |
| 151 | cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1)); | 151 | cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err); |
| 152 | switch (cmd->rsp.arg[0]) { | 152 | switch (cmd->rsp.arg[0]) { |
| 153 | case QLCNIC_RCODE_INVALID_ARGS: | 153 | case QLCNIC_RCODE_INVALID_ARGS: |
| 154 | fmt = "CDRP invalid args: [%d]\n"; | 154 | fmt = "CDRP invalid args: [%d]\n"; |
| @@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, | |||
| 175 | cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS; | 175 | cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS; |
| 176 | 176 | ||
| 177 | for (i = 1; i < cmd->rsp.num; i++) | 177 | for (i = 1; i < cmd->rsp.num; i++) |
| 178 | cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i)); | 178 | cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err); |
| 179 | 179 | ||
| 180 | /* Release semaphore */ | 180 | /* Release semaphore */ |
| 181 | qlcnic_api_unlock(adapter); | 181 | qlcnic_api_unlock(adapter); |
| @@ -210,10 +210,10 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd) | |||
| 210 | if (err) { | 210 | if (err) { |
| 211 | dev_info(&adapter->pdev->dev, | 211 | dev_info(&adapter->pdev->dev, |
| 212 | "Failed to set driver version in firmware\n"); | 212 | "Failed to set driver version in firmware\n"); |
| 213 | return -EIO; | 213 | err = -EIO; |
| 214 | } | 214 | } |
| 215 | 215 | qlcnic_free_mbx_args(&cmd); | |
| 216 | return 0; | 216 | return err; |
| 217 | } | 217 | } |
| 218 | 218 | ||
| 219 | int | 219 | int |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index 05a847e599c6..7aac23ab31d1 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
| @@ -150,6 +150,7 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = { | |||
| 150 | "Link_Test_on_offline", | 150 | "Link_Test_on_offline", |
| 151 | "Interrupt_Test_offline", | 151 | "Interrupt_Test_offline", |
| 152 | "Internal_Loopback_offline", | 152 | "Internal_Loopback_offline", |
| 153 | "External_Loopback_offline", | ||
| 153 | "EEPROM_Test_offline" | 154 | "EEPROM_Test_offline" |
| 154 | }; | 155 | }; |
| 155 | 156 | ||
| @@ -266,7 +267,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 266 | { | 267 | { |
| 267 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 268 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
| 268 | u32 speed, reg; | 269 | u32 speed, reg; |
| 269 | int check_sfp_module = 0; | 270 | int check_sfp_module = 0, err = 0; |
| 270 | u16 pcifn = ahw->pci_func; | 271 | u16 pcifn = ahw->pci_func; |
| 271 | 272 | ||
| 272 | /* read which mode */ | 273 | /* read which mode */ |
| @@ -289,7 +290,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 289 | 290 | ||
| 290 | } else if (adapter->ahw->port_type == QLCNIC_XGBE) { | 291 | } else if (adapter->ahw->port_type == QLCNIC_XGBE) { |
| 291 | u32 val = 0; | 292 | u32 val = 0; |
| 292 | val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR); | 293 | val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err); |
| 293 | 294 | ||
| 294 | if (val == QLCNIC_PORT_MODE_802_3_AP) { | 295 | if (val == QLCNIC_PORT_MODE_802_3_AP) { |
| 295 | ecmd->supported = SUPPORTED_1000baseT_Full; | 296 | ecmd->supported = SUPPORTED_1000baseT_Full; |
| @@ -300,9 +301,13 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | |||
| 300 | } | 301 | } |
| 301 | 302 | ||
| 302 | if (netif_running(adapter->netdev) && ahw->has_link_events) { | 303 | if (netif_running(adapter->netdev) && ahw->has_link_events) { |
| 303 | reg = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn)); | 304 | if (ahw->linkup) { |
| 304 | speed = P3P_LINK_SPEED_VAL(pcifn, reg); | 305 | reg = QLCRD32(adapter, |
| 305 | ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; | 306 | P3P_LINK_SPEED_REG(pcifn), &err); |
| 307 | speed = P3P_LINK_SPEED_VAL(pcifn, reg); | ||
| 308 | ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; | ||
| 309 | } | ||
| 310 | |||
| 306 | ethtool_cmd_speed_set(ecmd, ahw->link_speed); | 311 | ethtool_cmd_speed_set(ecmd, ahw->link_speed); |
| 307 | ecmd->autoneg = ahw->link_autoneg; | 312 | ecmd->autoneg = ahw->link_autoneg; |
| 308 | ecmd->duplex = ahw->link_duplex; | 313 | ecmd->duplex = ahw->link_duplex; |
| @@ -463,13 +468,14 @@ static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
| 463 | static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, | 468 | static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, |
| 464 | u32 *regs_buff) | 469 | u32 *regs_buff) |
| 465 | { | 470 | { |
| 466 | int i, j = 0; | 471 | int i, j = 0, err = 0; |
| 467 | 472 | ||
| 468 | for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) | 473 | for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) |
| 469 | regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); | 474 | regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); |
| 470 | j = 0; | 475 | j = 0; |
| 471 | while (ext_diag_registers[j] != -1) | 476 | while (ext_diag_registers[j] != -1) |
| 472 | regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++]); | 477 | regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++], |
| 478 | &err); | ||
| 473 | return i; | 479 | return i; |
| 474 | } | 480 | } |
| 475 | 481 | ||
| @@ -519,13 +525,16 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) | |||
| 519 | static u32 qlcnic_test_link(struct net_device *dev) | 525 | static u32 qlcnic_test_link(struct net_device *dev) |
| 520 | { | 526 | { |
| 521 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 527 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 528 | int err = 0; | ||
| 522 | u32 val; | 529 | u32 val; |
| 523 | 530 | ||
| 524 | if (qlcnic_83xx_check(adapter)) { | 531 | if (qlcnic_83xx_check(adapter)) { |
| 525 | val = qlcnic_83xx_test_link(adapter); | 532 | val = qlcnic_83xx_test_link(adapter); |
| 526 | return (val & 1) ? 0 : 1; | 533 | return (val & 1) ? 0 : 1; |
| 527 | } | 534 | } |
| 528 | val = QLCRD32(adapter, CRB_XG_STATE_P3P); | 535 | val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err); |
| 536 | if (err == -EIO) | ||
| 537 | return err; | ||
| 529 | val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); | 538 | val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); |
| 530 | return (val == XG_LINK_UP_P3P) ? 0 : 1; | 539 | return (val == XG_LINK_UP_P3P) ? 0 : 1; |
| 531 | } | 540 | } |
| @@ -658,6 +667,7 @@ qlcnic_get_pauseparam(struct net_device *netdev, | |||
| 658 | { | 667 | { |
| 659 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 668 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 660 | int port = adapter->ahw->physical_port; | 669 | int port = adapter->ahw->physical_port; |
| 670 | int err = 0; | ||
| 661 | __u32 val; | 671 | __u32 val; |
| 662 | 672 | ||
| 663 | if (qlcnic_83xx_check(adapter)) { | 673 | if (qlcnic_83xx_check(adapter)) { |
| @@ -668,9 +678,13 @@ qlcnic_get_pauseparam(struct net_device *netdev, | |||
| 668 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) | 678 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) |
| 669 | return; | 679 | return; |
| 670 | /* get flow control settings */ | 680 | /* get flow control settings */ |
| 671 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); | 681 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err); |
| 682 | if (err == -EIO) | ||
| 683 | return; | ||
| 672 | pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); | 684 | pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); |
| 673 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); | 685 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err); |
| 686 | if (err == -EIO) | ||
| 687 | return; | ||
| 674 | switch (port) { | 688 | switch (port) { |
| 675 | case 0: | 689 | case 0: |
| 676 | pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); | 690 | pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); |
| @@ -690,7 +704,9 @@ qlcnic_get_pauseparam(struct net_device *netdev, | |||
| 690 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) | 704 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) |
| 691 | return; | 705 | return; |
| 692 | pause->rx_pause = 1; | 706 | pause->rx_pause = 1; |
| 693 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); | 707 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err); |
| 708 | if (err == -EIO) | ||
| 709 | return; | ||
| 694 | if (port == 0) | 710 | if (port == 0) |
| 695 | pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); | 711 | pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); |
| 696 | else | 712 | else |
| @@ -707,6 +723,7 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 707 | { | 723 | { |
| 708 | struct qlcnic_adapter *adapter = netdev_priv(netdev); | 724 | struct qlcnic_adapter *adapter = netdev_priv(netdev); |
| 709 | int port = adapter->ahw->physical_port; | 725 | int port = adapter->ahw->physical_port; |
| 726 | int err = 0; | ||
| 710 | __u32 val; | 727 | __u32 val; |
| 711 | 728 | ||
| 712 | if (qlcnic_83xx_check(adapter)) | 729 | if (qlcnic_83xx_check(adapter)) |
| @@ -717,7 +734,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 717 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) | 734 | if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) |
| 718 | return -EIO; | 735 | return -EIO; |
| 719 | /* set flow control */ | 736 | /* set flow control */ |
| 720 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); | 737 | val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err); |
| 738 | if (err == -EIO) | ||
| 739 | return err; | ||
| 721 | 740 | ||
| 722 | if (pause->rx_pause) | 741 | if (pause->rx_pause) |
| 723 | qlcnic_gb_rx_flowctl(val); | 742 | qlcnic_gb_rx_flowctl(val); |
| @@ -728,7 +747,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 728 | val); | 747 | val); |
| 729 | QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); | 748 | QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); |
| 730 | /* set autoneg */ | 749 | /* set autoneg */ |
| 731 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); | 750 | val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err); |
| 751 | if (err == -EIO) | ||
| 752 | return err; | ||
| 732 | switch (port) { | 753 | switch (port) { |
| 733 | case 0: | 754 | case 0: |
| 734 | if (pause->tx_pause) | 755 | if (pause->tx_pause) |
| @@ -764,7 +785,9 @@ qlcnic_set_pauseparam(struct net_device *netdev, | |||
| 764 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) | 785 | if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) |
| 765 | return -EIO; | 786 | return -EIO; |
| 766 | 787 | ||
| 767 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); | 788 | val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err); |
| 789 | if (err == -EIO) | ||
| 790 | return err; | ||
| 768 | if (port == 0) { | 791 | if (port == 0) { |
| 769 | if (pause->tx_pause) | 792 | if (pause->tx_pause) |
| 770 | qlcnic_xg_unset_xg0_mask(val); | 793 | qlcnic_xg_unset_xg0_mask(val); |
| @@ -788,11 +811,14 @@ static int qlcnic_reg_test(struct net_device *dev) | |||
| 788 | { | 811 | { |
| 789 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 812 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 790 | u32 data_read; | 813 | u32 data_read; |
| 814 | int err = 0; | ||
| 791 | 815 | ||
| 792 | if (qlcnic_83xx_check(adapter)) | 816 | if (qlcnic_83xx_check(adapter)) |
| 793 | return qlcnic_83xx_reg_test(adapter); | 817 | return qlcnic_83xx_reg_test(adapter); |
| 794 | 818 | ||
| 795 | data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0)); | 819 | data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err); |
| 820 | if (err == -EIO) | ||
| 821 | return err; | ||
| 796 | if ((data_read & 0xffff) != adapter->pdev->vendor) | 822 | if ((data_read & 0xffff) != adapter->pdev->vendor) |
| 797 | return 1; | 823 | return 1; |
| 798 | 824 | ||
| @@ -1026,8 +1052,15 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test, | |||
| 1026 | if (data[3]) | 1052 | if (data[3]) |
| 1027 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1053 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1028 | 1054 | ||
| 1029 | data[4] = qlcnic_eeprom_test(dev); | 1055 | if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) { |
| 1030 | if (data[4]) | 1056 | data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE); |
| 1057 | if (data[4]) | ||
| 1058 | eth_test->flags |= ETH_TEST_FL_FAILED; | ||
| 1059 | eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | data[5] = qlcnic_eeprom_test(dev); | ||
| 1063 | if (data[5]) | ||
| 1031 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1064 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1032 | } | 1065 | } |
| 1033 | } | 1066 | } |
| @@ -1257,17 +1290,20 @@ qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 1257 | { | 1290 | { |
| 1258 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 1291 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 1259 | u32 wol_cfg; | 1292 | u32 wol_cfg; |
| 1293 | int err = 0; | ||
| 1260 | 1294 | ||
| 1261 | if (qlcnic_83xx_check(adapter)) | 1295 | if (qlcnic_83xx_check(adapter)) |
| 1262 | return; | 1296 | return; |
| 1263 | wol->supported = 0; | 1297 | wol->supported = 0; |
| 1264 | wol->wolopts = 0; | 1298 | wol->wolopts = 0; |
| 1265 | 1299 | ||
| 1266 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); | 1300 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); |
| 1301 | if (err == -EIO) | ||
| 1302 | return; | ||
| 1267 | if (wol_cfg & (1UL << adapter->portnum)) | 1303 | if (wol_cfg & (1UL << adapter->portnum)) |
| 1268 | wol->supported |= WAKE_MAGIC; | 1304 | wol->supported |= WAKE_MAGIC; |
| 1269 | 1305 | ||
| 1270 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); | 1306 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); |
| 1271 | if (wol_cfg & (1UL << adapter->portnum)) | 1307 | if (wol_cfg & (1UL << adapter->portnum)) |
| 1272 | wol->wolopts |= WAKE_MAGIC; | 1308 | wol->wolopts |= WAKE_MAGIC; |
| 1273 | } | 1309 | } |
| @@ -1277,17 +1313,22 @@ qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 1277 | { | 1313 | { |
| 1278 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 1314 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
| 1279 | u32 wol_cfg; | 1315 | u32 wol_cfg; |
| 1316 | int err = 0; | ||
| 1280 | 1317 | ||
| 1281 | if (qlcnic_83xx_check(adapter)) | 1318 | if (qlcnic_83xx_check(adapter)) |
| 1282 | return -EOPNOTSUPP; | 1319 | return -EOPNOTSUPP; |
| 1283 | if (wol->wolopts & ~WAKE_MAGIC) | 1320 | if (wol->wolopts & ~WAKE_MAGIC) |
| 1284 | return -EINVAL; | 1321 | return -EINVAL; |
| 1285 | 1322 | ||
| 1286 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); | 1323 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); |
| 1324 | if (err == -EIO) | ||
| 1325 | return err; | ||
| 1287 | if (!(wol_cfg & (1 << adapter->portnum))) | 1326 | if (!(wol_cfg & (1 << adapter->portnum))) |
| 1288 | return -EOPNOTSUPP; | 1327 | return -EOPNOTSUPP; |
| 1289 | 1328 | ||
| 1290 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); | 1329 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); |
| 1330 | if (err == -EIO) | ||
| 1331 | return err; | ||
| 1291 | if (wol->wolopts & WAKE_MAGIC) | 1332 | if (wol->wolopts & WAKE_MAGIC) |
| 1292 | wol_cfg |= 1UL << adapter->portnum; | 1333 | wol_cfg |= 1UL << adapter->portnum; |
| 1293 | else | 1334 | else |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c index 4ed7e73d88d3..4d5f59b2d153 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c | |||
| @@ -317,16 +317,20 @@ static void qlcnic_write_window_reg(u32 addr, void __iomem *bar0, u32 data) | |||
| 317 | int | 317 | int |
| 318 | qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) | 318 | qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) |
| 319 | { | 319 | { |
| 320 | int done = 0, timeout = 0; | 320 | int timeout = 0; |
| 321 | int err = 0; | ||
| 322 | u32 done = 0; | ||
| 321 | 323 | ||
| 322 | while (!done) { | 324 | while (!done) { |
| 323 | done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem))); | 325 | done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)), |
| 326 | &err); | ||
| 324 | if (done == 1) | 327 | if (done == 1) |
| 325 | break; | 328 | break; |
| 326 | if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) { | 329 | if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) { |
| 327 | dev_err(&adapter->pdev->dev, | 330 | dev_err(&adapter->pdev->dev, |
| 328 | "Failed to acquire sem=%d lock; holdby=%d\n", | 331 | "Failed to acquire sem=%d lock; holdby=%d\n", |
| 329 | sem, id_reg ? QLCRD32(adapter, id_reg) : -1); | 332 | sem, |
| 333 | id_reg ? QLCRD32(adapter, id_reg, &err) : -1); | ||
| 330 | return -EIO; | 334 | return -EIO; |
| 331 | } | 335 | } |
| 332 | msleep(1); | 336 | msleep(1); |
| @@ -341,19 +345,22 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) | |||
| 341 | void | 345 | void |
| 342 | qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem) | 346 | qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem) |
| 343 | { | 347 | { |
| 344 | QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem))); | 348 | int err = 0; |
| 349 | |||
| 350 | QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)), &err); | ||
| 345 | } | 351 | } |
| 346 | 352 | ||
| 347 | int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr) | 353 | int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr) |
| 348 | { | 354 | { |
| 355 | int err = 0; | ||
| 349 | u32 data; | 356 | u32 data; |
| 350 | 357 | ||
| 351 | if (qlcnic_82xx_check(adapter)) | 358 | if (qlcnic_82xx_check(adapter)) |
| 352 | qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data); | 359 | qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data); |
| 353 | else { | 360 | else { |
| 354 | data = qlcnic_83xx_rd_reg_indirect(adapter, addr); | 361 | data = QLCRD32(adapter, addr, &err); |
| 355 | if (data == -EIO) | 362 | if (err == -EIO) |
| 356 | return -EIO; | 363 | return err; |
| 357 | } | 364 | } |
| 358 | return data; | 365 | return data; |
| 359 | } | 366 | } |
| @@ -1159,7 +1166,8 @@ int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *adapter, ulong off, | |||
| 1159 | return -EIO; | 1166 | return -EIO; |
| 1160 | } | 1167 | } |
| 1161 | 1168 | ||
| 1162 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off) | 1169 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off, |
| 1170 | int *err) | ||
| 1163 | { | 1171 | { |
| 1164 | unsigned long flags; | 1172 | unsigned long flags; |
| 1165 | int rv; | 1173 | int rv; |
| @@ -1415,7 +1423,7 @@ int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *adapter, u64 off, u64 *data) | |||
| 1415 | 1423 | ||
| 1416 | int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) | 1424 | int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) |
| 1417 | { | 1425 | { |
| 1418 | int offset, board_type, magic; | 1426 | int offset, board_type, magic, err = 0; |
| 1419 | struct pci_dev *pdev = adapter->pdev; | 1427 | struct pci_dev *pdev = adapter->pdev; |
| 1420 | 1428 | ||
| 1421 | offset = QLCNIC_FW_MAGIC_OFFSET; | 1429 | offset = QLCNIC_FW_MAGIC_OFFSET; |
| @@ -1435,7 +1443,9 @@ int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) | |||
| 1435 | adapter->ahw->board_type = board_type; | 1443 | adapter->ahw->board_type = board_type; |
| 1436 | 1444 | ||
| 1437 | if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) { | 1445 | if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) { |
| 1438 | u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I); | 1446 | u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I, &err); |
| 1447 | if (err == -EIO) | ||
| 1448 | return err; | ||
| 1439 | if ((gpio & 0x8000) == 0) | 1449 | if ((gpio & 0x8000) == 0) |
| 1440 | board_type = QLCNIC_BRDTYPE_P3P_10G_TP; | 1450 | board_type = QLCNIC_BRDTYPE_P3P_10G_TP; |
| 1441 | } | 1451 | } |
| @@ -1475,10 +1485,13 @@ int | |||
| 1475 | qlcnic_wol_supported(struct qlcnic_adapter *adapter) | 1485 | qlcnic_wol_supported(struct qlcnic_adapter *adapter) |
| 1476 | { | 1486 | { |
| 1477 | u32 wol_cfg; | 1487 | u32 wol_cfg; |
| 1488 | int err = 0; | ||
| 1478 | 1489 | ||
| 1479 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); | 1490 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); |
| 1480 | if (wol_cfg & (1UL << adapter->portnum)) { | 1491 | if (wol_cfg & (1UL << adapter->portnum)) { |
| 1481 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); | 1492 | wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); |
| 1493 | if (err == -EIO) | ||
| 1494 | return err; | ||
| 1482 | if (wol_cfg & (1 << adapter->portnum)) | 1495 | if (wol_cfg & (1 << adapter->portnum)) |
| 1483 | return 1; | 1496 | return 1; |
| 1484 | } | 1497 | } |
| @@ -1539,6 +1552,7 @@ void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter) | |||
| 1539 | void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | 1552 | void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, |
| 1540 | loff_t offset, size_t size) | 1553 | loff_t offset, size_t size) |
| 1541 | { | 1554 | { |
| 1555 | int err = 0; | ||
| 1542 | u32 data; | 1556 | u32 data; |
| 1543 | u64 qmdata; | 1557 | u64 qmdata; |
| 1544 | 1558 | ||
| @@ -1546,7 +1560,7 @@ void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, | |||
| 1546 | qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata); | 1560 | qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata); |
| 1547 | memcpy(buf, &qmdata, size); | 1561 | memcpy(buf, &qmdata, size); |
| 1548 | } else { | 1562 | } else { |
| 1549 | data = QLCRD32(adapter, offset); | 1563 | data = QLCRD32(adapter, offset, &err); |
| 1550 | memcpy(buf, &data, size); | 1564 | memcpy(buf, &data, size); |
| 1551 | } | 1565 | } |
| 1552 | } | 1566 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h index 2c22504f57aa..4a71b28effcb 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h | |||
| @@ -154,7 +154,7 @@ struct qlcnic_hardware_context; | |||
| 154 | struct qlcnic_adapter; | 154 | struct qlcnic_adapter; |
| 155 | 155 | ||
| 156 | int qlcnic_82xx_start_firmware(struct qlcnic_adapter *); | 156 | int qlcnic_82xx_start_firmware(struct qlcnic_adapter *); |
| 157 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong); | 157 | int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong, int *); |
| 158 | int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32); | 158 | int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32); |
| 159 | int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int); | 159 | int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int); |
| 160 | int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32); | 160 | int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c index a2023090e866..974d62607e13 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | |||
| @@ -286,10 +286,11 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter) | |||
| 286 | { | 286 | { |
| 287 | long timeout = 0; | 287 | long timeout = 0; |
| 288 | long done = 0; | 288 | long done = 0; |
| 289 | int err = 0; | ||
| 289 | 290 | ||
| 290 | cond_resched(); | 291 | cond_resched(); |
| 291 | while (done == 0) { | 292 | while (done == 0) { |
| 292 | done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS); | 293 | done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS, &err); |
| 293 | done &= 2; | 294 | done &= 2; |
| 294 | if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) { | 295 | if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) { |
| 295 | dev_err(&adapter->pdev->dev, | 296 | dev_err(&adapter->pdev->dev, |
| @@ -304,6 +305,8 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter) | |||
| 304 | static int do_rom_fast_read(struct qlcnic_adapter *adapter, | 305 | static int do_rom_fast_read(struct qlcnic_adapter *adapter, |
| 305 | u32 addr, u32 *valp) | 306 | u32 addr, u32 *valp) |
| 306 | { | 307 | { |
| 308 | int err = 0; | ||
| 309 | |||
| 307 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr); | 310 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr); |
| 308 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 311 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
| 309 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3); | 312 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3); |
| @@ -317,7 +320,9 @@ static int do_rom_fast_read(struct qlcnic_adapter *adapter, | |||
| 317 | udelay(10); | 320 | udelay(10); |
| 318 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 321 | QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
| 319 | 322 | ||
| 320 | *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA); | 323 | *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA, &err); |
| 324 | if (err == -EIO) | ||
| 325 | return err; | ||
| 321 | return 0; | 326 | return 0; |
| 322 | } | 327 | } |
| 323 | 328 | ||
| @@ -369,11 +374,11 @@ int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp) | |||
| 369 | 374 | ||
| 370 | int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) | 375 | int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) |
| 371 | { | 376 | { |
| 372 | int addr, val; | 377 | int addr, err = 0; |
| 373 | int i, n, init_delay; | 378 | int i, n, init_delay; |
| 374 | struct crb_addr_pair *buf; | 379 | struct crb_addr_pair *buf; |
| 375 | unsigned offset; | 380 | unsigned offset; |
| 376 | u32 off; | 381 | u32 off, val; |
| 377 | struct pci_dev *pdev = adapter->pdev; | 382 | struct pci_dev *pdev = adapter->pdev; |
| 378 | 383 | ||
| 379 | QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0); | 384 | QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0); |
| @@ -402,7 +407,9 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) | |||
| 402 | QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00); | 407 | QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00); |
| 403 | 408 | ||
| 404 | /* halt sre */ | 409 | /* halt sre */ |
| 405 | val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000); | 410 | val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000, &err); |
| 411 | if (err == -EIO) | ||
| 412 | return err; | ||
| 406 | QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1))); | 413 | QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1))); |
| 407 | 414 | ||
| 408 | /* halt epg */ | 415 | /* halt epg */ |
| @@ -719,10 +726,12 @@ qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter) | |||
| 719 | static int | 726 | static int |
| 720 | qlcnic_has_mn(struct qlcnic_adapter *adapter) | 727 | qlcnic_has_mn(struct qlcnic_adapter *adapter) |
| 721 | { | 728 | { |
| 722 | u32 capability; | 729 | u32 capability = 0; |
| 723 | capability = 0; | 730 | int err = 0; |
| 724 | 731 | ||
| 725 | capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY); | 732 | capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY, &err); |
| 733 | if (err == -EIO) | ||
| 734 | return err; | ||
| 726 | if (capability & QLCNIC_PEG_TUNE_MN_PRESENT) | 735 | if (capability & QLCNIC_PEG_TUNE_MN_PRESENT) |
| 727 | return 1; | 736 | return 1; |
| 728 | 737 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index d3f8797efcc3..6946d354f44f 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
| @@ -161,36 +161,68 @@ static inline int qlcnic_82xx_is_lb_pkt(u64 sts_data) | |||
| 161 | return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0; | 161 | return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | static void qlcnic_delete_rx_list_mac(struct qlcnic_adapter *adapter, | ||
| 165 | struct qlcnic_filter *fil, | ||
| 166 | void *addr, u16 vlan_id) | ||
| 167 | { | ||
| 168 | int ret; | ||
| 169 | u8 op; | ||
| 170 | |||
| 171 | op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | ||
| 172 | ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op); | ||
| 173 | if (ret) | ||
| 174 | return; | ||
| 175 | |||
| 176 | op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; | ||
| 177 | ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op); | ||
| 178 | if (!ret) { | ||
| 179 | hlist_del(&fil->fnode); | ||
| 180 | adapter->rx_fhash.fnum--; | ||
| 181 | } | ||
| 182 | } | ||
| 183 | |||
| 184 | static struct qlcnic_filter *qlcnic_find_mac_filter(struct hlist_head *head, | ||
| 185 | void *addr, u16 vlan_id) | ||
| 186 | { | ||
| 187 | struct qlcnic_filter *tmp_fil = NULL; | ||
| 188 | struct hlist_node *n; | ||
| 189 | |||
| 190 | hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { | ||
| 191 | if (!memcmp(tmp_fil->faddr, addr, ETH_ALEN) && | ||
| 192 | tmp_fil->vlan_id == vlan_id) | ||
| 193 | return tmp_fil; | ||
| 194 | } | ||
| 195 | |||
| 196 | return NULL; | ||
| 197 | } | ||
| 198 | |||
| 164 | void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, | 199 | void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, |
| 165 | int loopback_pkt, u16 vlan_id) | 200 | int loopback_pkt, u16 vlan_id) |
| 166 | { | 201 | { |
| 167 | struct ethhdr *phdr = (struct ethhdr *)(skb->data); | 202 | struct ethhdr *phdr = (struct ethhdr *)(skb->data); |
| 168 | struct qlcnic_filter *fil, *tmp_fil; | 203 | struct qlcnic_filter *fil, *tmp_fil; |
| 169 | struct hlist_node *n; | ||
| 170 | struct hlist_head *head; | 204 | struct hlist_head *head; |
| 171 | unsigned long time; | 205 | unsigned long time; |
| 172 | u64 src_addr = 0; | 206 | u64 src_addr = 0; |
| 173 | u8 hindex, found = 0, op; | 207 | u8 hindex, op; |
| 174 | int ret; | 208 | int ret; |
| 175 | 209 | ||
| 176 | memcpy(&src_addr, phdr->h_source, ETH_ALEN); | 210 | memcpy(&src_addr, phdr->h_source, ETH_ALEN); |
| 211 | hindex = qlcnic_mac_hash(src_addr) & | ||
| 212 | (adapter->fhash.fbucket_size - 1); | ||
| 177 | 213 | ||
| 178 | if (loopback_pkt) { | 214 | if (loopback_pkt) { |
| 179 | if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax) | 215 | if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax) |
| 180 | return; | 216 | return; |
| 181 | 217 | ||
| 182 | hindex = qlcnic_mac_hash(src_addr) & | ||
| 183 | (adapter->fhash.fbucket_size - 1); | ||
| 184 | head = &(adapter->rx_fhash.fhead[hindex]); | 218 | head = &(adapter->rx_fhash.fhead[hindex]); |
| 185 | 219 | ||
| 186 | hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { | 220 | tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id); |
| 187 | if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) && | 221 | if (tmp_fil) { |
| 188 | tmp_fil->vlan_id == vlan_id) { | 222 | time = tmp_fil->ftime; |
| 189 | time = tmp_fil->ftime; | 223 | if (time_after(jiffies, QLCNIC_READD_AGE * HZ + time)) |
| 190 | if (jiffies > (QLCNIC_READD_AGE * HZ + time)) | 224 | tmp_fil->ftime = jiffies; |
| 191 | tmp_fil->ftime = jiffies; | 225 | return; |
| 192 | return; | ||
| 193 | } | ||
| 194 | } | 226 | } |
| 195 | 227 | ||
| 196 | fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC); | 228 | fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC); |
| @@ -205,36 +237,37 @@ void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, | |||
| 205 | adapter->rx_fhash.fnum++; | 237 | adapter->rx_fhash.fnum++; |
| 206 | spin_unlock(&adapter->rx_mac_learn_lock); | 238 | spin_unlock(&adapter->rx_mac_learn_lock); |
| 207 | } else { | 239 | } else { |
| 208 | hindex = qlcnic_mac_hash(src_addr) & | 240 | head = &adapter->fhash.fhead[hindex]; |
| 209 | (adapter->fhash.fbucket_size - 1); | ||
| 210 | head = &(adapter->rx_fhash.fhead[hindex]); | ||
| 211 | spin_lock(&adapter->rx_mac_learn_lock); | ||
| 212 | hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { | ||
| 213 | if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) && | ||
| 214 | tmp_fil->vlan_id == vlan_id) { | ||
| 215 | found = 1; | ||
| 216 | break; | ||
| 217 | } | ||
| 218 | } | ||
| 219 | 241 | ||
| 220 | if (!found) { | 242 | spin_lock(&adapter->mac_learn_lock); |
| 221 | spin_unlock(&adapter->rx_mac_learn_lock); | ||
| 222 | return; | ||
| 223 | } | ||
| 224 | 243 | ||
| 225 | op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | 244 | tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id); |
| 226 | ret = qlcnic_sre_macaddr_change(adapter, (u8 *)&src_addr, | 245 | if (tmp_fil) { |
| 227 | vlan_id, op); | ||
| 228 | if (!ret) { | ||
| 229 | op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; | 246 | op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; |
| 230 | ret = qlcnic_sre_macaddr_change(adapter, | 247 | ret = qlcnic_sre_macaddr_change(adapter, |
| 231 | (u8 *)&src_addr, | 248 | (u8 *)&src_addr, |
| 232 | vlan_id, op); | 249 | vlan_id, op); |
| 233 | if (!ret) { | 250 | if (!ret) { |
| 234 | hlist_del(&(tmp_fil->fnode)); | 251 | hlist_del(&tmp_fil->fnode); |
| 235 | adapter->rx_fhash.fnum--; | 252 | adapter->fhash.fnum--; |
| 236 | } | 253 | } |
| 254 | |||
| 255 | spin_unlock(&adapter->mac_learn_lock); | ||
| 256 | |||
| 257 | return; | ||
| 237 | } | 258 | } |
| 259 | |||
| 260 | spin_unlock(&adapter->mac_learn_lock); | ||
| 261 | |||
| 262 | head = &adapter->rx_fhash.fhead[hindex]; | ||
| 263 | |||
| 264 | spin_lock(&adapter->rx_mac_learn_lock); | ||
| 265 | |||
| 266 | tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id); | ||
| 267 | if (tmp_fil) | ||
| 268 | qlcnic_delete_rx_list_mac(adapter, tmp_fil, &src_addr, | ||
| 269 | vlan_id); | ||
| 270 | |||
| 238 | spin_unlock(&adapter->rx_mac_learn_lock); | 271 | spin_unlock(&adapter->rx_mac_learn_lock); |
| 239 | } | 272 | } |
| 240 | } | 273 | } |
| @@ -262,7 +295,7 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr, | |||
| 262 | 295 | ||
| 263 | mac_req = (struct qlcnic_mac_req *)&(req->words[0]); | 296 | mac_req = (struct qlcnic_mac_req *)&(req->words[0]); |
| 264 | mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; | 297 | mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; |
| 265 | memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN); | 298 | memcpy(mac_req->mac_addr, uaddr, ETH_ALEN); |
| 266 | 299 | ||
| 267 | vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; | 300 | vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; |
| 268 | vlan_req->vlan_id = cpu_to_le16(vlan_id); | 301 | vlan_req->vlan_id = cpu_to_le16(vlan_id); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index cc78d3924c6a..ee013fcc3322 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
| @@ -977,8 +977,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter) | |||
| 977 | static int | 977 | static int |
| 978 | qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | 978 | qlcnic_initialize_nic(struct qlcnic_adapter *adapter) |
| 979 | { | 979 | { |
| 980 | int err; | ||
| 981 | struct qlcnic_info nic_info; | 980 | struct qlcnic_info nic_info; |
| 981 | int err = 0; | ||
| 982 | 982 | ||
| 983 | memset(&nic_info, 0, sizeof(struct qlcnic_info)); | 983 | memset(&nic_info, 0, sizeof(struct qlcnic_info)); |
| 984 | err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); | 984 | err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); |
| @@ -993,7 +993,9 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter) | |||
| 993 | 993 | ||
| 994 | if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { | 994 | if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { |
| 995 | u32 temp; | 995 | u32 temp; |
| 996 | temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2); | 996 | temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err); |
| 997 | if (err == -EIO) | ||
| 998 | return err; | ||
| 997 | adapter->ahw->extra_capability[0] = temp; | 999 | adapter->ahw->extra_capability[0] = temp; |
| 998 | } | 1000 | } |
| 999 | adapter->ahw->max_mac_filters = nic_info.max_mac_filters; | 1001 | adapter->ahw->max_mac_filters = nic_info.max_mac_filters; |
| @@ -2141,7 +2143,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 2141 | if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && | 2143 | if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && |
| 2142 | !!qlcnic_use_msi) | 2144 | !!qlcnic_use_msi) |
| 2143 | dev_warn(&pdev->dev, | 2145 | dev_warn(&pdev->dev, |
| 2144 | "83xx adapter do not support MSI interrupts\n"); | 2146 | "Device does not support MSI interrupts\n"); |
| 2145 | 2147 | ||
| 2146 | err = qlcnic_setup_intr(adapter, 0); | 2148 | err = qlcnic_setup_intr(adapter, 0); |
| 2147 | if (err) { | 2149 | if (err) { |
| @@ -3095,6 +3097,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) | |||
| 3095 | { | 3097 | { |
| 3096 | u32 state = 0, heartbeat; | 3098 | u32 state = 0, heartbeat; |
| 3097 | u32 peg_status; | 3099 | u32 peg_status; |
| 3100 | int err = 0; | ||
| 3098 | 3101 | ||
| 3099 | if (qlcnic_check_temp(adapter)) | 3102 | if (qlcnic_check_temp(adapter)) |
| 3100 | goto detach; | 3103 | goto detach; |
| @@ -3141,11 +3144,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter) | |||
| 3141 | "PEG_NET_4_PC: 0x%x\n", | 3144 | "PEG_NET_4_PC: 0x%x\n", |
| 3142 | peg_status, | 3145 | peg_status, |
| 3143 | QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), | 3146 | QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), |
| 3144 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c), | 3147 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err), |
| 3145 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c), | 3148 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err), |
| 3146 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c), | 3149 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err), |
| 3147 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c), | 3150 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err), |
| 3148 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c)); | 3151 | QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err)); |
| 3149 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) | 3152 | if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) |
| 3150 | dev_err(&adapter->pdev->dev, | 3153 | dev_err(&adapter->pdev->dev, |
| 3151 | "Firmware aborted with error code 0x00006700. " | 3154 | "Firmware aborted with error code 0x00006700. " |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c index 56e85f98117f..5d40045b3cea 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | |||
| @@ -562,7 +562,7 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, | |||
| 562 | INIT_LIST_HEAD(&adapter->vf_mc_list); | 562 | INIT_LIST_HEAD(&adapter->vf_mc_list); |
| 563 | if (!qlcnic_use_msi_x && !!qlcnic_use_msi) | 563 | if (!qlcnic_use_msi_x && !!qlcnic_use_msi) |
| 564 | dev_warn(&adapter->pdev->dev, | 564 | dev_warn(&adapter->pdev->dev, |
| 565 | "83xx adapter do not support MSI interrupts\n"); | 565 | "Device does not support MSI interrupts\n"); |
| 566 | 566 | ||
| 567 | err = qlcnic_setup_intr(adapter, 1); | 567 | err = qlcnic_setup_intr(adapter, 1); |
| 568 | if (err) { | 568 | if (err) { |
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index e6acb9fa5767..6f35f8404d68 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c | |||
| @@ -478,7 +478,7 @@ rx_status_loop: | |||
| 478 | 478 | ||
| 479 | while (1) { | 479 | while (1) { |
| 480 | u32 status, len; | 480 | u32 status, len; |
| 481 | dma_addr_t mapping; | 481 | dma_addr_t mapping, new_mapping; |
| 482 | struct sk_buff *skb, *new_skb; | 482 | struct sk_buff *skb, *new_skb; |
| 483 | struct cp_desc *desc; | 483 | struct cp_desc *desc; |
| 484 | const unsigned buflen = cp->rx_buf_sz; | 484 | const unsigned buflen = cp->rx_buf_sz; |
| @@ -520,6 +520,13 @@ rx_status_loop: | |||
| 520 | goto rx_next; | 520 | goto rx_next; |
| 521 | } | 521 | } |
| 522 | 522 | ||
| 523 | new_mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen, | ||
| 524 | PCI_DMA_FROMDEVICE); | ||
| 525 | if (dma_mapping_error(&cp->pdev->dev, new_mapping)) { | ||
| 526 | dev->stats.rx_dropped++; | ||
| 527 | goto rx_next; | ||
| 528 | } | ||
| 529 | |||
| 523 | dma_unmap_single(&cp->pdev->dev, mapping, | 530 | dma_unmap_single(&cp->pdev->dev, mapping, |
| 524 | buflen, PCI_DMA_FROMDEVICE); | 531 | buflen, PCI_DMA_FROMDEVICE); |
| 525 | 532 | ||
| @@ -531,12 +538,11 @@ rx_status_loop: | |||
| 531 | 538 | ||
| 532 | skb_put(skb, len); | 539 | skb_put(skb, len); |
| 533 | 540 | ||
| 534 | mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen, | ||
| 535 | PCI_DMA_FROMDEVICE); | ||
| 536 | cp->rx_skb[rx_tail] = new_skb; | 541 | cp->rx_skb[rx_tail] = new_skb; |
| 537 | 542 | ||
| 538 | cp_rx_skb(cp, skb, desc); | 543 | cp_rx_skb(cp, skb, desc); |
| 539 | rx++; | 544 | rx++; |
| 545 | mapping = new_mapping; | ||
| 540 | 546 | ||
| 541 | rx_next: | 547 | rx_next: |
| 542 | cp->rx_ring[rx_tail].opts2 = 0; | 548 | cp->rx_ring[rx_tail].opts2 = 0; |
| @@ -716,6 +722,22 @@ static inline u32 cp_tx_vlan_tag(struct sk_buff *skb) | |||
| 716 | TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; | 722 | TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; |
| 717 | } | 723 | } |
| 718 | 724 | ||
| 725 | static void unwind_tx_frag_mapping(struct cp_private *cp, struct sk_buff *skb, | ||
| 726 | int first, int entry_last) | ||
| 727 | { | ||
| 728 | int frag, index; | ||
| 729 | struct cp_desc *txd; | ||
| 730 | skb_frag_t *this_frag; | ||
| 731 | for (frag = 0; frag+first < entry_last; frag++) { | ||
| 732 | index = first+frag; | ||
| 733 | cp->tx_skb[index] = NULL; | ||
| 734 | txd = &cp->tx_ring[index]; | ||
| 735 | this_frag = &skb_shinfo(skb)->frags[frag]; | ||
| 736 | dma_unmap_single(&cp->pdev->dev, le64_to_cpu(txd->addr), | ||
| 737 | skb_frag_size(this_frag), PCI_DMA_TODEVICE); | ||
| 738 | } | ||
| 739 | } | ||
| 740 | |||
| 719 | static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | 741 | static netdev_tx_t cp_start_xmit (struct sk_buff *skb, |
| 720 | struct net_device *dev) | 742 | struct net_device *dev) |
| 721 | { | 743 | { |
| @@ -749,6 +771,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 749 | 771 | ||
| 750 | len = skb->len; | 772 | len = skb->len; |
| 751 | mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE); | 773 | mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE); |
| 774 | if (dma_mapping_error(&cp->pdev->dev, mapping)) | ||
| 775 | goto out_dma_error; | ||
| 776 | |||
| 752 | txd->opts2 = opts2; | 777 | txd->opts2 = opts2; |
| 753 | txd->addr = cpu_to_le64(mapping); | 778 | txd->addr = cpu_to_le64(mapping); |
| 754 | wmb(); | 779 | wmb(); |
| @@ -786,6 +811,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 786 | first_len = skb_headlen(skb); | 811 | first_len = skb_headlen(skb); |
| 787 | first_mapping = dma_map_single(&cp->pdev->dev, skb->data, | 812 | first_mapping = dma_map_single(&cp->pdev->dev, skb->data, |
| 788 | first_len, PCI_DMA_TODEVICE); | 813 | first_len, PCI_DMA_TODEVICE); |
| 814 | if (dma_mapping_error(&cp->pdev->dev, first_mapping)) | ||
| 815 | goto out_dma_error; | ||
| 816 | |||
| 789 | cp->tx_skb[entry] = skb; | 817 | cp->tx_skb[entry] = skb; |
| 790 | entry = NEXT_TX(entry); | 818 | entry = NEXT_TX(entry); |
| 791 | 819 | ||
| @@ -799,6 +827,11 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 799 | mapping = dma_map_single(&cp->pdev->dev, | 827 | mapping = dma_map_single(&cp->pdev->dev, |
| 800 | skb_frag_address(this_frag), | 828 | skb_frag_address(this_frag), |
| 801 | len, PCI_DMA_TODEVICE); | 829 | len, PCI_DMA_TODEVICE); |
| 830 | if (dma_mapping_error(&cp->pdev->dev, mapping)) { | ||
| 831 | unwind_tx_frag_mapping(cp, skb, first_entry, entry); | ||
| 832 | goto out_dma_error; | ||
| 833 | } | ||
| 834 | |||
| 802 | eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; | 835 | eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; |
| 803 | 836 | ||
| 804 | ctrl = eor | len | DescOwn; | 837 | ctrl = eor | len | DescOwn; |
| @@ -859,11 +892,16 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb, | |||
| 859 | if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1)) | 892 | if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1)) |
| 860 | netif_stop_queue(dev); | 893 | netif_stop_queue(dev); |
| 861 | 894 | ||
| 895 | out_unlock: | ||
| 862 | spin_unlock_irqrestore(&cp->lock, intr_flags); | 896 | spin_unlock_irqrestore(&cp->lock, intr_flags); |
| 863 | 897 | ||
| 864 | cpw8(TxPoll, NormalTxPoll); | 898 | cpw8(TxPoll, NormalTxPoll); |
| 865 | 899 | ||
| 866 | return NETDEV_TX_OK; | 900 | return NETDEV_TX_OK; |
| 901 | out_dma_error: | ||
| 902 | kfree_skb(skb); | ||
| 903 | cp->dev->stats.tx_dropped++; | ||
| 904 | goto out_unlock; | ||
| 867 | } | 905 | } |
| 868 | 906 | ||
| 869 | /* Set or clear the multicast filter for this adaptor. | 907 | /* Set or clear the multicast filter for this adaptor. |
| @@ -1054,6 +1092,10 @@ static int cp_refill_rx(struct cp_private *cp) | |||
| 1054 | 1092 | ||
| 1055 | mapping = dma_map_single(&cp->pdev->dev, skb->data, | 1093 | mapping = dma_map_single(&cp->pdev->dev, skb->data, |
| 1056 | cp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1094 | cp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
| 1095 | if (dma_mapping_error(&cp->pdev->dev, mapping)) { | ||
| 1096 | kfree_skb(skb); | ||
| 1097 | goto err_out; | ||
| 1098 | } | ||
| 1057 | cp->rx_skb[i] = skb; | 1099 | cp->rx_skb[i] = skb; |
| 1058 | 1100 | ||
| 1059 | cp->rx_ring[i].opts2 = 0; | 1101 | cp->rx_ring[i].opts2 = 0; |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 880015cae6a3..b5eb4195fc99 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -3689,7 +3689,7 @@ static void rtl_phy_work(struct rtl8169_private *tp) | |||
| 3689 | if (tp->link_ok(ioaddr)) | 3689 | if (tp->link_ok(ioaddr)) |
| 3690 | return; | 3690 | return; |
| 3691 | 3691 | ||
| 3692 | netif_warn(tp, link, tp->dev, "PHY reset until link up\n"); | 3692 | netif_dbg(tp, link, tp->dev, "PHY reset until link up\n"); |
| 3693 | 3693 | ||
| 3694 | tp->phy_reset_enable(tp); | 3694 | tp->phy_reset_enable(tp); |
| 3695 | 3695 | ||
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c index eb4aea3fe793..f5d7ad75e479 100644 --- a/drivers/net/ethernet/sis/sis900.c +++ b/drivers/net/ethernet/sis/sis900.c | |||
| @@ -1318,7 +1318,7 @@ static void sis900_timer(unsigned long data) | |||
| 1318 | if (duplex){ | 1318 | if (duplex){ |
| 1319 | sis900_set_mode(sis_priv, speed, duplex); | 1319 | sis900_set_mode(sis_priv, speed, duplex); |
| 1320 | sis630_set_eq(net_dev, sis_priv->chipset_rev); | 1320 | sis630_set_eq(net_dev, sis_priv->chipset_rev); |
| 1321 | netif_start_queue(net_dev); | 1321 | netif_carrier_on(net_dev); |
| 1322 | } | 1322 | } |
| 1323 | 1323 | ||
| 1324 | sis_priv->timer.expires = jiffies + HZ; | 1324 | sis_priv->timer.expires = jiffies + HZ; |
| @@ -1336,10 +1336,8 @@ static void sis900_timer(unsigned long data) | |||
| 1336 | status = sis900_default_phy(net_dev); | 1336 | status = sis900_default_phy(net_dev); |
| 1337 | mii_phy = sis_priv->mii; | 1337 | mii_phy = sis_priv->mii; |
| 1338 | 1338 | ||
| 1339 | if (status & MII_STAT_LINK){ | 1339 | if (status & MII_STAT_LINK) |
| 1340 | sis900_check_mode(net_dev, mii_phy); | 1340 | sis900_check_mode(net_dev, mii_phy); |
| 1341 | netif_carrier_on(net_dev); | ||
| 1342 | } | ||
| 1343 | } else { | 1341 | } else { |
| 1344 | /* Link ON -> OFF */ | 1342 | /* Link ON -> OFF */ |
| 1345 | if (!(status & MII_STAT_LINK)){ | 1343 | if (!(status & MII_STAT_LINK)){ |
| @@ -1612,12 +1610,6 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev) | |||
| 1612 | unsigned int index_cur_tx, index_dirty_tx; | 1610 | unsigned int index_cur_tx, index_dirty_tx; |
| 1613 | unsigned int count_dirty_tx; | 1611 | unsigned int count_dirty_tx; |
| 1614 | 1612 | ||
| 1615 | /* Don't transmit data before the complete of auto-negotiation */ | ||
| 1616 | if(!sis_priv->autong_complete){ | ||
| 1617 | netif_stop_queue(net_dev); | ||
| 1618 | return NETDEV_TX_BUSY; | ||
| 1619 | } | ||
| 1620 | |||
| 1621 | spin_lock_irqsave(&sis_priv->lock, flags); | 1613 | spin_lock_irqsave(&sis_priv->lock, flags); |
| 1622 | 1614 | ||
| 1623 | /* Calculate the next Tx descriptor entry. */ | 1615 | /* Calculate the next Tx descriptor entry. */ |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 05a1674e204f..22a7a4336211 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -1867,7 +1867,7 @@ static int cpsw_probe(struct platform_device *pdev) | |||
| 1867 | 1867 | ||
| 1868 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | 1868 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
| 1869 | for (i = res->start; i <= res->end; i++) { | 1869 | for (i = res->start; i <= res->end; i++) { |
| 1870 | if (request_irq(i, cpsw_interrupt, IRQF_DISABLED, | 1870 | if (request_irq(i, cpsw_interrupt, 0, |
| 1871 | dev_name(&pdev->dev), priv)) { | 1871 | dev_name(&pdev->dev), priv)) { |
| 1872 | dev_err(priv->dev, "error attaching irq\n"); | 1872 | dev_err(priv->dev, "error attaching irq\n"); |
| 1873 | goto clean_ale_ret; | 1873 | goto clean_ale_ret; |
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index 07b176bcf929..1a222bce4bd7 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c | |||
| @@ -1568,8 +1568,7 @@ static int emac_dev_open(struct net_device *ndev) | |||
| 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | 1568 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
| 1569 | for (i = res->start; i <= res->end; i++) { | 1569 | for (i = res->start; i <= res->end; i++) { |
| 1570 | if (devm_request_irq(&priv->pdev->dev, i, emac_irq, | 1570 | if (devm_request_irq(&priv->pdev->dev, i, emac_irq, |
| 1571 | IRQF_DISABLED, | 1571 | 0, ndev->name, ndev)) |
| 1572 | ndev->name, ndev)) | ||
| 1573 | goto rollback; | 1572 | goto rollback; |
| 1574 | } | 1573 | } |
| 1575 | k++; | 1574 | k++; |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 18373b6ae37d..d0f9c2fd1d4f 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
| @@ -337,8 +337,11 @@ static int macvlan_open(struct net_device *dev) | |||
| 337 | int err; | 337 | int err; |
| 338 | 338 | ||
| 339 | if (vlan->port->passthru) { | 339 | if (vlan->port->passthru) { |
| 340 | if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) | 340 | if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) { |
| 341 | dev_set_promiscuity(lowerdev, 1); | 341 | err = dev_set_promiscuity(lowerdev, 1); |
| 342 | if (err < 0) | ||
| 343 | goto out; | ||
| 344 | } | ||
| 342 | goto hash_add; | 345 | goto hash_add; |
| 343 | } | 346 | } |
| 344 | 347 | ||
| @@ -863,6 +866,18 @@ static int macvlan_changelink(struct net_device *dev, | |||
| 863 | struct nlattr *tb[], struct nlattr *data[]) | 866 | struct nlattr *tb[], struct nlattr *data[]) |
| 864 | { | 867 | { |
| 865 | struct macvlan_dev *vlan = netdev_priv(dev); | 868 | struct macvlan_dev *vlan = netdev_priv(dev); |
| 869 | enum macvlan_mode mode; | ||
| 870 | bool set_mode = false; | ||
| 871 | |||
| 872 | /* Validate mode, but don't set yet: setting flags may fail. */ | ||
| 873 | if (data && data[IFLA_MACVLAN_MODE]) { | ||
| 874 | set_mode = true; | ||
| 875 | mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); | ||
| 876 | /* Passthrough mode can't be set or cleared dynamically */ | ||
| 877 | if ((mode == MACVLAN_MODE_PASSTHRU) != | ||
| 878 | (vlan->mode == MACVLAN_MODE_PASSTHRU)) | ||
| 879 | return -EINVAL; | ||
| 880 | } | ||
| 866 | 881 | ||
| 867 | if (data && data[IFLA_MACVLAN_FLAGS]) { | 882 | if (data && data[IFLA_MACVLAN_FLAGS]) { |
| 868 | __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); | 883 | __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); |
| @@ -879,8 +894,8 @@ static int macvlan_changelink(struct net_device *dev, | |||
| 879 | } | 894 | } |
| 880 | vlan->flags = flags; | 895 | vlan->flags = flags; |
| 881 | } | 896 | } |
| 882 | if (data && data[IFLA_MACVLAN_MODE]) | 897 | if (set_mode) |
| 883 | vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); | 898 | vlan->mode = mode; |
| 884 | return 0; | 899 | return 0; |
| 885 | } | 900 | } |
| 886 | 901 | ||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index ee13f9eb740c..11c51f275366 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
| @@ -344,17 +344,41 @@ static const int multicast_filter_limit = 32; | |||
| 344 | static | 344 | static |
| 345 | int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) | 345 | int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) |
| 346 | { | 346 | { |
| 347 | return usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0), | 347 | int ret; |
| 348 | void *tmp; | ||
| 349 | |||
| 350 | tmp = kmalloc(size, GFP_KERNEL); | ||
| 351 | if (!tmp) | ||
| 352 | return -ENOMEM; | ||
| 353 | |||
| 354 | ret = usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0), | ||
| 348 | RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, | 355 | RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, |
| 349 | value, index, data, size, 500); | 356 | value, index, tmp, size, 500); |
| 357 | |||
| 358 | memcpy(data, tmp, size); | ||
| 359 | kfree(tmp); | ||
| 360 | |||
| 361 | return ret; | ||
| 350 | } | 362 | } |
| 351 | 363 | ||
| 352 | static | 364 | static |
| 353 | int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) | 365 | int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) |
| 354 | { | 366 | { |
| 355 | return usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0), | 367 | int ret; |
| 368 | void *tmp; | ||
| 369 | |||
| 370 | tmp = kmalloc(size, GFP_KERNEL); | ||
| 371 | if (!tmp) | ||
| 372 | return -ENOMEM; | ||
| 373 | |||
| 374 | memcpy(tmp, data, size); | ||
| 375 | |||
| 376 | ret = usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0), | ||
| 356 | RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, | 377 | RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, |
| 357 | value, index, data, size, 500); | 378 | value, index, tmp, size, 500); |
| 379 | |||
| 380 | kfree(tmp); | ||
| 381 | return ret; | ||
| 358 | } | 382 | } |
| 359 | 383 | ||
| 360 | static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size, | 384 | static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size, |
| @@ -490,37 +514,31 @@ int usb_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data) | |||
| 490 | 514 | ||
| 491 | static u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index) | 515 | static u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index) |
| 492 | { | 516 | { |
| 493 | u32 data; | 517 | __le32 data; |
| 494 | 518 | ||
| 495 | if (type == MCU_TYPE_PLA) | 519 | generic_ocp_read(tp, index, sizeof(data), &data, type); |
| 496 | pla_ocp_read(tp, index, sizeof(data), &data); | ||
| 497 | else | ||
| 498 | usb_ocp_read(tp, index, sizeof(data), &data); | ||
| 499 | 520 | ||
| 500 | return __le32_to_cpu(data); | 521 | return __le32_to_cpu(data); |
| 501 | } | 522 | } |
| 502 | 523 | ||
| 503 | static void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data) | 524 | static void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data) |
| 504 | { | 525 | { |
| 505 | if (type == MCU_TYPE_PLA) | 526 | __le32 tmp = __cpu_to_le32(data); |
| 506 | pla_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(data), &data); | 527 | |
| 507 | else | 528 | generic_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(tmp), &tmp, type); |
| 508 | usb_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(data), &data); | ||
| 509 | } | 529 | } |
| 510 | 530 | ||
| 511 | static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index) | 531 | static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index) |
| 512 | { | 532 | { |
| 513 | u32 data; | 533 | u32 data; |
| 534 | __le32 tmp; | ||
| 514 | u8 shift = index & 2; | 535 | u8 shift = index & 2; |
| 515 | 536 | ||
| 516 | index &= ~3; | 537 | index &= ~3; |
| 517 | 538 | ||
| 518 | if (type == MCU_TYPE_PLA) | 539 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); |
| 519 | pla_ocp_read(tp, index, sizeof(data), &data); | ||
| 520 | else | ||
| 521 | usb_ocp_read(tp, index, sizeof(data), &data); | ||
| 522 | 540 | ||
| 523 | data = __le32_to_cpu(data); | 541 | data = __le32_to_cpu(tmp); |
| 524 | data >>= (shift * 8); | 542 | data >>= (shift * 8); |
| 525 | data &= 0xffff; | 543 | data &= 0xffff; |
| 526 | 544 | ||
| @@ -529,7 +547,8 @@ static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index) | |||
| 529 | 547 | ||
| 530 | static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) | 548 | static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) |
| 531 | { | 549 | { |
| 532 | u32 tmp, mask = 0xffff; | 550 | u32 mask = 0xffff; |
| 551 | __le32 tmp; | ||
| 533 | u16 byen = BYTE_EN_WORD; | 552 | u16 byen = BYTE_EN_WORD; |
| 534 | u8 shift = index & 2; | 553 | u8 shift = index & 2; |
| 535 | 554 | ||
| @@ -542,34 +561,25 @@ static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) | |||
| 542 | index &= ~3; | 561 | index &= ~3; |
| 543 | } | 562 | } |
| 544 | 563 | ||
| 545 | if (type == MCU_TYPE_PLA) | 564 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); |
| 546 | pla_ocp_read(tp, index, sizeof(tmp), &tmp); | ||
| 547 | else | ||
| 548 | usb_ocp_read(tp, index, sizeof(tmp), &tmp); | ||
| 549 | 565 | ||
| 550 | tmp = __le32_to_cpu(tmp) & ~mask; | 566 | data |= __le32_to_cpu(tmp) & ~mask; |
| 551 | tmp |= data; | 567 | tmp = __cpu_to_le32(data); |
| 552 | tmp = __cpu_to_le32(tmp); | ||
| 553 | 568 | ||
| 554 | if (type == MCU_TYPE_PLA) | 569 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); |
| 555 | pla_ocp_write(tp, index, byen, sizeof(tmp), &tmp); | ||
| 556 | else | ||
| 557 | usb_ocp_write(tp, index, byen, sizeof(tmp), &tmp); | ||
| 558 | } | 570 | } |
| 559 | 571 | ||
| 560 | static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index) | 572 | static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index) |
| 561 | { | 573 | { |
| 562 | u32 data; | 574 | u32 data; |
| 575 | __le32 tmp; | ||
| 563 | u8 shift = index & 3; | 576 | u8 shift = index & 3; |
| 564 | 577 | ||
| 565 | index &= ~3; | 578 | index &= ~3; |
| 566 | 579 | ||
| 567 | if (type == MCU_TYPE_PLA) | 580 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); |
| 568 | pla_ocp_read(tp, index, sizeof(data), &data); | ||
| 569 | else | ||
| 570 | usb_ocp_read(tp, index, sizeof(data), &data); | ||
| 571 | 581 | ||
| 572 | data = __le32_to_cpu(data); | 582 | data = __le32_to_cpu(tmp); |
| 573 | data >>= (shift * 8); | 583 | data >>= (shift * 8); |
| 574 | data &= 0xff; | 584 | data &= 0xff; |
| 575 | 585 | ||
| @@ -578,7 +588,8 @@ static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index) | |||
| 578 | 588 | ||
| 579 | static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) | 589 | static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) |
| 580 | { | 590 | { |
| 581 | u32 tmp, mask = 0xff; | 591 | u32 mask = 0xff; |
| 592 | __le32 tmp; | ||
| 582 | u16 byen = BYTE_EN_BYTE; | 593 | u16 byen = BYTE_EN_BYTE; |
| 583 | u8 shift = index & 3; | 594 | u8 shift = index & 3; |
| 584 | 595 | ||
| @@ -591,19 +602,12 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) | |||
| 591 | index &= ~3; | 602 | index &= ~3; |
| 592 | } | 603 | } |
| 593 | 604 | ||
| 594 | if (type == MCU_TYPE_PLA) | 605 | generic_ocp_read(tp, index, sizeof(tmp), &tmp, type); |
| 595 | pla_ocp_read(tp, index, sizeof(tmp), &tmp); | ||
| 596 | else | ||
| 597 | usb_ocp_read(tp, index, sizeof(tmp), &tmp); | ||
| 598 | 606 | ||
| 599 | tmp = __le32_to_cpu(tmp) & ~mask; | 607 | data |= __le32_to_cpu(tmp) & ~mask; |
| 600 | tmp |= data; | 608 | tmp = __cpu_to_le32(data); |
| 601 | tmp = __cpu_to_le32(tmp); | ||
| 602 | 609 | ||
| 603 | if (type == MCU_TYPE_PLA) | 610 | generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type); |
| 604 | pla_ocp_write(tp, index, byen, sizeof(tmp), &tmp); | ||
| 605 | else | ||
| 606 | usb_ocp_write(tp, index, byen, sizeof(tmp), &tmp); | ||
| 607 | } | 611 | } |
| 608 | 612 | ||
| 609 | static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value) | 613 | static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value) |
| @@ -685,21 +689,14 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data) | |||
| 685 | static inline void set_ethernet_addr(struct r8152 *tp) | 689 | static inline void set_ethernet_addr(struct r8152 *tp) |
| 686 | { | 690 | { |
| 687 | struct net_device *dev = tp->netdev; | 691 | struct net_device *dev = tp->netdev; |
| 688 | u8 *node_id; | 692 | u8 node_id[8] = {0}; |
| 689 | |||
| 690 | node_id = kmalloc(sizeof(u8) * 8, GFP_KERNEL); | ||
| 691 | if (!node_id) { | ||
| 692 | netif_err(tp, probe, dev, "out of memory"); | ||
| 693 | return; | ||
| 694 | } | ||
| 695 | 693 | ||
| 696 | if (pla_ocp_read(tp, PLA_IDR, sizeof(u8) * 8, node_id) < 0) | 694 | if (pla_ocp_read(tp, PLA_IDR, sizeof(node_id), node_id) < 0) |
| 697 | netif_notice(tp, probe, dev, "inet addr fail\n"); | 695 | netif_notice(tp, probe, dev, "inet addr fail\n"); |
| 698 | else { | 696 | else { |
| 699 | memcpy(dev->dev_addr, node_id, dev->addr_len); | 697 | memcpy(dev->dev_addr, node_id, dev->addr_len); |
| 700 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | 698 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); |
| 701 | } | 699 | } |
| 702 | kfree(node_id); | ||
| 703 | } | 700 | } |
| 704 | 701 | ||
| 705 | static int rtl8152_set_mac_address(struct net_device *netdev, void *p) | 702 | static int rtl8152_set_mac_address(struct net_device *netdev, void *p) |
| @@ -882,15 +879,10 @@ static void rtl8152_set_rx_mode(struct net_device *netdev) | |||
| 882 | static void _rtl8152_set_rx_mode(struct net_device *netdev) | 879 | static void _rtl8152_set_rx_mode(struct net_device *netdev) |
| 883 | { | 880 | { |
| 884 | struct r8152 *tp = netdev_priv(netdev); | 881 | struct r8152 *tp = netdev_priv(netdev); |
| 885 | u32 tmp, *mc_filter; /* Multicast hash filter */ | 882 | u32 mc_filter[2]; /* Multicast hash filter */ |
| 883 | __le32 tmp[2]; | ||
| 886 | u32 ocp_data; | 884 | u32 ocp_data; |
| 887 | 885 | ||
| 888 | mc_filter = kmalloc(sizeof(u32) * 2, GFP_KERNEL); | ||
| 889 | if (!mc_filter) { | ||
| 890 | netif_err(tp, link, netdev, "out of memory"); | ||
| 891 | return; | ||
| 892 | } | ||
| 893 | |||
| 894 | clear_bit(RTL8152_SET_RX_MODE, &tp->flags); | 886 | clear_bit(RTL8152_SET_RX_MODE, &tp->flags); |
| 895 | netif_stop_queue(netdev); | 887 | netif_stop_queue(netdev); |
| 896 | ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); | 888 | ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); |
| @@ -918,14 +910,12 @@ static void _rtl8152_set_rx_mode(struct net_device *netdev) | |||
| 918 | } | 910 | } |
| 919 | } | 911 | } |
| 920 | 912 | ||
| 921 | tmp = mc_filter[0]; | 913 | tmp[0] = __cpu_to_le32(swab32(mc_filter[1])); |
| 922 | mc_filter[0] = __cpu_to_le32(swab32(mc_filter[1])); | 914 | tmp[1] = __cpu_to_le32(swab32(mc_filter[0])); |
| 923 | mc_filter[1] = __cpu_to_le32(swab32(tmp)); | ||
| 924 | 915 | ||
| 925 | pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(u32) * 2, mc_filter); | 916 | pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(tmp), tmp); |
| 926 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); | 917 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); |
| 927 | netif_wake_queue(netdev); | 918 | netif_wake_queue(netdev); |
| 928 | kfree(mc_filter); | ||
| 929 | } | 919 | } |
| 930 | 920 | ||
| 931 | static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, | 921 | static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, |
diff --git a/drivers/net/usb/r815x.c b/drivers/net/usb/r815x.c index 852392269718..2df2f4fb42a7 100644 --- a/drivers/net/usb/r815x.c +++ b/drivers/net/usb/r815x.c | |||
| @@ -24,34 +24,43 @@ | |||
| 24 | 24 | ||
| 25 | static int pla_read_word(struct usb_device *udev, u16 index) | 25 | static int pla_read_word(struct usb_device *udev, u16 index) |
| 26 | { | 26 | { |
| 27 | int data, ret; | 27 | int ret; |
| 28 | u8 shift = index & 2; | 28 | u8 shift = index & 2; |
| 29 | __le32 ocp_data; | 29 | __le32 *tmp; |
| 30 | |||
| 31 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
| 32 | if (!tmp) | ||
| 33 | return -ENOMEM; | ||
| 30 | 34 | ||
| 31 | index &= ~3; | 35 | index &= ~3; |
| 32 | 36 | ||
| 33 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 37 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
| 34 | RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, | 38 | RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, |
| 35 | index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data), | 39 | index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500); |
| 36 | 500); | ||
| 37 | if (ret < 0) | 40 | if (ret < 0) |
| 38 | return ret; | 41 | goto out2; |
| 39 | 42 | ||
| 40 | data = __le32_to_cpu(ocp_data); | 43 | ret = __le32_to_cpu(*tmp); |
| 41 | data >>= (shift * 8); | 44 | ret >>= (shift * 8); |
| 42 | data &= 0xffff; | 45 | ret &= 0xffff; |
| 43 | 46 | ||
| 44 | return data; | 47 | out2: |
| 48 | kfree(tmp); | ||
| 49 | return ret; | ||
| 45 | } | 50 | } |
| 46 | 51 | ||
| 47 | static int pla_write_word(struct usb_device *udev, u16 index, u32 data) | 52 | static int pla_write_word(struct usb_device *udev, u16 index, u32 data) |
| 48 | { | 53 | { |
| 49 | __le32 ocp_data; | 54 | __le32 *tmp; |
| 50 | u32 mask = 0xffff; | 55 | u32 mask = 0xffff; |
| 51 | u16 byen = BYTE_EN_WORD; | 56 | u16 byen = BYTE_EN_WORD; |
| 52 | u8 shift = index & 2; | 57 | u8 shift = index & 2; |
| 53 | int ret; | 58 | int ret; |
| 54 | 59 | ||
| 60 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
| 61 | if (!tmp) | ||
| 62 | return -ENOMEM; | ||
| 63 | |||
| 55 | data &= mask; | 64 | data &= mask; |
| 56 | 65 | ||
| 57 | if (shift) { | 66 | if (shift) { |
| @@ -63,19 +72,20 @@ static int pla_write_word(struct usb_device *udev, u16 index, u32 data) | |||
| 63 | 72 | ||
| 64 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 73 | ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
| 65 | RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, | 74 | RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, |
| 66 | index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data), | 75 | index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500); |
| 67 | 500); | ||
| 68 | if (ret < 0) | 76 | if (ret < 0) |
| 69 | return ret; | 77 | goto out3; |
| 70 | 78 | ||
| 71 | data |= __le32_to_cpu(ocp_data) & ~mask; | 79 | data |= __le32_to_cpu(*tmp) & ~mask; |
| 72 | ocp_data = __cpu_to_le32(data); | 80 | *tmp = __cpu_to_le32(data); |
| 73 | 81 | ||
| 74 | ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 82 | ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 75 | RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE, | 83 | RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE, |
| 76 | index, MCU_TYPE_PLA | byen, &ocp_data, | 84 | index, MCU_TYPE_PLA | byen, tmp, sizeof(*tmp), |
| 77 | sizeof(ocp_data), 500); | 85 | 500); |
| 78 | 86 | ||
| 87 | out3: | ||
| 88 | kfree(tmp); | ||
| 79 | return ret; | 89 | return ret; |
| 80 | } | 90 | } |
| 81 | 91 | ||
| @@ -116,11 +126,18 @@ out1: | |||
| 116 | static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg) | 126 | static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg) |
| 117 | { | 127 | { |
| 118 | struct usbnet *dev = netdev_priv(netdev); | 128 | struct usbnet *dev = netdev_priv(netdev); |
| 129 | int ret; | ||
| 119 | 130 | ||
| 120 | if (phy_id != R815x_PHY_ID) | 131 | if (phy_id != R815x_PHY_ID) |
| 121 | return -EINVAL; | 132 | return -EINVAL; |
| 122 | 133 | ||
| 123 | return ocp_reg_read(dev, BASE_MII + reg * 2); | 134 | if (usb_autopm_get_interface(dev->intf) < 0) |
| 135 | return -ENODEV; | ||
| 136 | |||
| 137 | ret = ocp_reg_read(dev, BASE_MII + reg * 2); | ||
| 138 | |||
| 139 | usb_autopm_put_interface(dev->intf); | ||
| 140 | return ret; | ||
| 124 | } | 141 | } |
| 125 | 142 | ||
| 126 | static | 143 | static |
| @@ -131,7 +148,12 @@ void r815x_mdio_write(struct net_device *netdev, int phy_id, int reg, int val) | |||
| 131 | if (phy_id != R815x_PHY_ID) | 148 | if (phy_id != R815x_PHY_ID) |
| 132 | return; | 149 | return; |
| 133 | 150 | ||
| 151 | if (usb_autopm_get_interface(dev->intf) < 0) | ||
| 152 | return; | ||
| 153 | |||
| 134 | ocp_reg_write(dev, BASE_MII + reg * 2, val); | 154 | ocp_reg_write(dev, BASE_MII + reg * 2, val); |
| 155 | |||
| 156 | usb_autopm_put_interface(dev->intf); | ||
| 135 | } | 157 | } |
| 136 | 158 | ||
| 137 | static int r8153_bind(struct usbnet *dev, struct usb_interface *intf) | 159 | static int r8153_bind(struct usbnet *dev, struct usb_interface *intf) |
| @@ -150,7 +172,7 @@ static int r8153_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 150 | dev->mii.phy_id = R815x_PHY_ID; | 172 | dev->mii.phy_id = R815x_PHY_ID; |
| 151 | dev->mii.supports_gmii = 1; | 173 | dev->mii.supports_gmii = 1; |
| 152 | 174 | ||
| 153 | return 0; | 175 | return status; |
| 154 | } | 176 | } |
| 155 | 177 | ||
| 156 | static int r8152_bind(struct usbnet *dev, struct usb_interface *intf) | 178 | static int r8152_bind(struct usbnet *dev, struct usb_interface *intf) |
| @@ -169,7 +191,7 @@ static int r8152_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 169 | dev->mii.phy_id = R815x_PHY_ID; | 191 | dev->mii.phy_id = R815x_PHY_ID; |
| 170 | dev->mii.supports_gmii = 0; | 192 | dev->mii.supports_gmii = 0; |
| 171 | 193 | ||
| 172 | return 0; | 194 | return status; |
| 173 | } | 195 | } |
| 174 | 196 | ||
| 175 | static const struct driver_info r8152_info = { | 197 | static const struct driver_info r8152_info = { |
diff --git a/drivers/net/wireless/ath/ath10k/Kconfig b/drivers/net/wireless/ath/ath10k/Kconfig index cde58fe96254..82e8088ca9b4 100644 --- a/drivers/net/wireless/ath/ath10k/Kconfig +++ b/drivers/net/wireless/ath/ath10k/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config ATH10K | 1 | config ATH10K |
| 2 | tristate "Atheros 802.11ac wireless cards support" | 2 | tristate "Atheros 802.11ac wireless cards support" |
| 3 | depends on MAC80211 | 3 | depends on MAC80211 && HAS_DMA |
| 4 | select ATH_COMMON | 4 | select ATH_COMMON |
| 5 | ---help--- | 5 | ---help--- |
| 6 | This module adds support for wireless adapters based on | 6 | This module adds support for wireless adapters based on |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 277b37ae7126..7fa71f73cfe8 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
| @@ -1093,8 +1093,11 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif) | |||
| 1093 | brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n "); | 1093 | brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n "); |
| 1094 | err = brcmf_fil_cmd_data_set(vif->ifp, | 1094 | err = brcmf_fil_cmd_data_set(vif->ifp, |
| 1095 | BRCMF_C_DISASSOC, NULL, 0); | 1095 | BRCMF_C_DISASSOC, NULL, 0); |
| 1096 | if (err) | 1096 | if (err) { |
| 1097 | brcmf_err("WLC_DISASSOC failed (%d)\n", err); | 1097 | brcmf_err("WLC_DISASSOC failed (%d)\n", err); |
| 1098 | cfg80211_disconnected(vif->wdev.netdev, 0, | ||
| 1099 | NULL, 0, GFP_KERNEL); | ||
| 1100 | } | ||
| 1098 | clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state); | 1101 | clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state); |
| 1099 | } | 1102 | } |
| 1100 | clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state); | 1103 | clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index ff8cc75c189d..a70c7b9d9bad 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
| @@ -97,6 +97,8 @@ | |||
| 97 | 97 | ||
| 98 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) | 98 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) |
| 99 | 99 | ||
| 100 | #define APMG_RTC_INT_STT_RFKILL (0x10000000) | ||
| 101 | |||
| 100 | /* Device system time */ | 102 | /* Device system time */ |
| 101 | #define DEVICE_SYSTEM_TIME_REG 0xA0206C | 103 | #define DEVICE_SYSTEM_TIME_REG 0xA0206C |
| 102 | 104 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c index 7e5e5c2f9f87..83da884cf303 100644 --- a/drivers/net/wireless/iwlwifi/mvm/d3.c +++ b/drivers/net/wireless/iwlwifi/mvm/d3.c | |||
| @@ -134,7 +134,7 @@ struct wowlan_key_data { | |||
| 134 | struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc; | 134 | struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc; |
| 135 | struct iwl_wowlan_tkip_params_cmd *tkip; | 135 | struct iwl_wowlan_tkip_params_cmd *tkip; |
| 136 | bool error, use_rsc_tsc, use_tkip; | 136 | bool error, use_rsc_tsc, use_tkip; |
| 137 | int gtk_key_idx; | 137 | int wep_key_idx; |
| 138 | }; | 138 | }; |
| 139 | 139 | ||
| 140 | static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | 140 | static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, |
| @@ -188,8 +188,8 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | |||
| 188 | wkc.wep_key.key_offset = 0; | 188 | wkc.wep_key.key_offset = 0; |
| 189 | } else { | 189 | } else { |
| 190 | /* others start at 1 */ | 190 | /* others start at 1 */ |
| 191 | data->gtk_key_idx++; | 191 | data->wep_key_idx++; |
| 192 | wkc.wep_key.key_offset = data->gtk_key_idx; | 192 | wkc.wep_key.key_offset = data->wep_key_idx; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC, | 195 | ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC, |
| @@ -316,8 +316,13 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | |||
| 316 | mvm->ptk_ivlen = key->iv_len; | 316 | mvm->ptk_ivlen = key->iv_len; |
| 317 | mvm->ptk_icvlen = key->icv_len; | 317 | mvm->ptk_icvlen = key->icv_len; |
| 318 | } else { | 318 | } else { |
| 319 | data->gtk_key_idx++; | 319 | /* |
| 320 | key->hw_key_idx = data->gtk_key_idx; | 320 | * firmware only supports TSC/RSC for a single key, |
| 321 | * so if there are multiple keep overwriting them | ||
| 322 | * with new ones -- this relies on mac80211 doing | ||
| 323 | * list_add_tail(). | ||
| 324 | */ | ||
| 325 | key->hw_key_idx = 1; | ||
| 321 | mvm->gtk_ivlen = key->iv_len; | 326 | mvm->gtk_ivlen = key->iv_len; |
| 322 | mvm->gtk_icvlen = key->icv_len; | 327 | mvm->gtk_icvlen = key->icv_len; |
| 323 | } | 328 | } |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h index b60d14151721..365095a0c3b3 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | |||
| @@ -69,7 +69,6 @@ | |||
| 69 | /* Scan Commands, Responses, Notifications */ | 69 | /* Scan Commands, Responses, Notifications */ |
| 70 | 70 | ||
| 71 | /* Masks for iwl_scan_channel.type flags */ | 71 | /* Masks for iwl_scan_channel.type flags */ |
| 72 | #define SCAN_CHANNEL_TYPE_PASSIVE 0 | ||
| 73 | #define SCAN_CHANNEL_TYPE_ACTIVE BIT(0) | 72 | #define SCAN_CHANNEL_TYPE_ACTIVE BIT(0) |
| 74 | #define SCAN_CHANNEL_NARROW_BAND BIT(22) | 73 | #define SCAN_CHANNEL_NARROW_BAND BIT(22) |
| 75 | 74 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index 1eedc424051c..f19baf0dea6b 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
| @@ -512,6 +512,27 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, | |||
| 512 | goto out_unlock; | 512 | goto out_unlock; |
| 513 | 513 | ||
| 514 | /* | 514 | /* |
| 515 | * TODO: remove this temporary code. | ||
| 516 | * Currently MVM FW supports power management only on single MAC. | ||
| 517 | * If new interface added, disable PM on existing interface. | ||
| 518 | * P2P device is a special case, since it is handled by FW similary to | ||
| 519 | * scan. If P2P deviced is added, PM remains enabled on existing | ||
| 520 | * interface. | ||
| 521 | * Note: the method below does not count the new interface being added | ||
| 522 | * at this moment. | ||
| 523 | */ | ||
| 524 | if (vif->type != NL80211_IFTYPE_P2P_DEVICE) | ||
| 525 | mvm->vif_count++; | ||
| 526 | if (mvm->vif_count > 1) { | ||
| 527 | IWL_DEBUG_MAC80211(mvm, | ||
| 528 | "Disable power on existing interfaces\n"); | ||
| 529 | ieee80211_iterate_active_interfaces_atomic( | ||
| 530 | mvm->hw, | ||
| 531 | IEEE80211_IFACE_ITER_NORMAL, | ||
| 532 | iwl_mvm_pm_disable_iterator, mvm); | ||
| 533 | } | ||
| 534 | |||
| 535 | /* | ||
| 515 | * The AP binding flow can be done only after the beacon | 536 | * The AP binding flow can be done only after the beacon |
| 516 | * template is configured (which happens only in the mac80211 | 537 | * template is configured (which happens only in the mac80211 |
| 517 | * start_ap() flow), and adding the broadcast station can happen | 538 | * start_ap() flow), and adding the broadcast station can happen |
| @@ -534,27 +555,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, | |||
| 534 | goto out_unlock; | 555 | goto out_unlock; |
| 535 | } | 556 | } |
| 536 | 557 | ||
| 537 | /* | ||
| 538 | * TODO: remove this temporary code. | ||
| 539 | * Currently MVM FW supports power management only on single MAC. | ||
| 540 | * If new interface added, disable PM on existing interface. | ||
| 541 | * P2P device is a special case, since it is handled by FW similary to | ||
| 542 | * scan. If P2P deviced is added, PM remains enabled on existing | ||
| 543 | * interface. | ||
| 544 | * Note: the method below does not count the new interface being added | ||
| 545 | * at this moment. | ||
| 546 | */ | ||
| 547 | if (vif->type != NL80211_IFTYPE_P2P_DEVICE) | ||
| 548 | mvm->vif_count++; | ||
| 549 | if (mvm->vif_count > 1) { | ||
| 550 | IWL_DEBUG_MAC80211(mvm, | ||
| 551 | "Disable power on existing interfaces\n"); | ||
| 552 | ieee80211_iterate_active_interfaces_atomic( | ||
| 553 | mvm->hw, | ||
| 554 | IEEE80211_IFACE_ITER_NORMAL, | ||
| 555 | iwl_mvm_pm_disable_iterator, mvm); | ||
| 556 | } | ||
| 557 | |||
| 558 | ret = iwl_mvm_mac_ctxt_add(mvm, vif); | 558 | ret = iwl_mvm_mac_ctxt_add(mvm, vif); |
| 559 | if (ret) | 559 | if (ret) |
| 560 | goto out_release; | 560 | goto out_release; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index 268f027b45b0..acdff6b67e04 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
| @@ -178,19 +178,12 @@ static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd, | |||
| 178 | struct iwl_scan_channel *chan = (struct iwl_scan_channel *) | 178 | struct iwl_scan_channel *chan = (struct iwl_scan_channel *) |
| 179 | (cmd->data + le16_to_cpu(cmd->tx_cmd.len)); | 179 | (cmd->data + le16_to_cpu(cmd->tx_cmd.len)); |
| 180 | int i; | 180 | int i; |
| 181 | __le32 chan_type_value; | ||
| 182 | |||
| 183 | if (req->n_ssids > 0) | ||
| 184 | chan_type_value = cpu_to_le32(BIT(req->n_ssids) - 1); | ||
| 185 | else | ||
| 186 | chan_type_value = SCAN_CHANNEL_TYPE_PASSIVE; | ||
| 187 | 181 | ||
| 188 | for (i = 0; i < cmd->channel_count; i++) { | 182 | for (i = 0; i < cmd->channel_count; i++) { |
| 189 | chan->channel = cpu_to_le16(req->channels[i]->hw_value); | 183 | chan->channel = cpu_to_le16(req->channels[i]->hw_value); |
| 184 | chan->type = cpu_to_le32(BIT(req->n_ssids) - 1); | ||
| 190 | if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 185 | if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) |
| 191 | chan->type = SCAN_CHANNEL_TYPE_PASSIVE; | 186 | chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE); |
| 192 | else | ||
| 193 | chan->type = chan_type_value; | ||
| 194 | chan->active_dwell = cpu_to_le16(active_dwell); | 187 | chan->active_dwell = cpu_to_le16(active_dwell); |
| 195 | chan->passive_dwell = cpu_to_le16(passive_dwell); | 188 | chan->passive_dwell = cpu_to_le16(passive_dwell); |
| 196 | chan->iteration_count = cpu_to_le16(1); | 189 | chan->iteration_count = cpu_to_le16(1); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c index 85d4bbe52157..563f559b902d 100644 --- a/drivers/net/wireless/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/iwlwifi/mvm/sta.c | |||
| @@ -915,6 +915,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif, | |||
| 915 | struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv; | 915 | struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv; |
| 916 | struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; | 916 | struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; |
| 917 | u16 txq_id; | 917 | u16 txq_id; |
| 918 | enum iwl_mvm_agg_state old_state; | ||
| 918 | 919 | ||
| 919 | /* | 920 | /* |
| 920 | * First set the agg state to OFF to avoid calling | 921 | * First set the agg state to OFF to avoid calling |
| @@ -924,13 +925,17 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif, | |||
| 924 | txq_id = tid_data->txq_id; | 925 | txq_id = tid_data->txq_id; |
| 925 | IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n", | 926 | IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n", |
| 926 | mvmsta->sta_id, tid, txq_id, tid_data->state); | 927 | mvmsta->sta_id, tid, txq_id, tid_data->state); |
| 928 | old_state = tid_data->state; | ||
| 927 | tid_data->state = IWL_AGG_OFF; | 929 | tid_data->state = IWL_AGG_OFF; |
| 928 | spin_unlock_bh(&mvmsta->lock); | 930 | spin_unlock_bh(&mvmsta->lock); |
| 929 | 931 | ||
| 930 | if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) | 932 | if (old_state >= IWL_AGG_ON) { |
| 931 | IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); | 933 | if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) |
| 934 | IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); | ||
| 935 | |||
| 936 | iwl_trans_txq_disable(mvm->trans, tid_data->txq_id); | ||
| 937 | } | ||
| 932 | 938 | ||
| 933 | iwl_trans_txq_disable(mvm->trans, tid_data->txq_id); | ||
| 934 | mvm->queue_to_mac80211[tid_data->txq_id] = | 939 | mvm->queue_to_mac80211[tid_data->txq_id] = |
| 935 | IWL_INVALID_MAC80211_QUEUE; | 940 | IWL_INVALID_MAC80211_QUEUE; |
| 936 | 941 | ||
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index 81f3ea5b09a4..ff13458efc27 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
| @@ -130,6 +130,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { | |||
| 130 | {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */ | 130 | {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */ |
| 131 | {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */ | 131 | {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */ |
| 132 | {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */ | 132 | {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */ |
| 133 | {IWL_PCI_DEVICE(0x423C, 0x1326, iwl5150_abg_cfg)}, /* Half Mini Card */ | ||
| 133 | 134 | ||
| 134 | {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */ | 135 | {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */ |
| 135 | {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */ | 136 | {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */ |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index fd848cd1583e..f600e68a410a 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
| @@ -888,6 +888,14 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) | |||
| 888 | 888 | ||
| 889 | iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); | 889 | iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); |
| 890 | if (hw_rfkill) { | 890 | if (hw_rfkill) { |
| 891 | /* | ||
| 892 | * Clear the interrupt in APMG if the NIC is going down. | ||
| 893 | * Note that when the NIC exits RFkill (else branch), we | ||
| 894 | * can't access prph and the NIC will be reset in | ||
| 895 | * start_hw anyway. | ||
| 896 | */ | ||
| 897 | iwl_write_prph(trans, APMG_RTC_INT_STT_REG, | ||
| 898 | APMG_RTC_INT_STT_RFKILL); | ||
| 891 | set_bit(STATUS_RFKILL, &trans_pcie->status); | 899 | set_bit(STATUS_RFKILL, &trans_pcie->status); |
| 892 | if (test_and_clear_bit(STATUS_HCMD_ACTIVE, | 900 | if (test_and_clear_bit(STATUS_HCMD_ACTIVE, |
| 893 | &trans_pcie->status)) | 901 | &trans_pcie->status)) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 826c15602c46..96cfcdd39079 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
| @@ -670,6 +670,11 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans) | |||
| 670 | return err; | 670 | return err; |
| 671 | } | 671 | } |
| 672 | 672 | ||
| 673 | /* Reset the entire device */ | ||
| 674 | iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); | ||
| 675 | |||
| 676 | usleep_range(10, 15); | ||
| 677 | |||
| 673 | iwl_pcie_apm_init(trans); | 678 | iwl_pcie_apm_init(trans); |
| 674 | 679 | ||
| 675 | /* From now on, the op_mode will be kept updated about RF kill state */ | 680 | /* From now on, the op_mode will be kept updated about RF kill state */ |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index ef5fa890a286..89459db4c53b 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
| @@ -1716,9 +1716,9 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev, | |||
| 1716 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | 1716 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); |
| 1717 | int ret; | 1717 | int ret; |
| 1718 | 1718 | ||
| 1719 | if (priv->bss_mode != NL80211_IFTYPE_STATION) { | 1719 | if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) { |
| 1720 | wiphy_err(wiphy, | 1720 | wiphy_err(wiphy, |
| 1721 | "%s: reject infra assoc request in non-STA mode\n", | 1721 | "%s: reject infra assoc request in non-STA role\n", |
| 1722 | dev->name); | 1722 | dev->name); |
| 1723 | return -EINVAL; | 1723 | return -EINVAL; |
| 1724 | } | 1724 | } |
diff --git a/drivers/net/wireless/mwifiex/cfp.c b/drivers/net/wireless/mwifiex/cfp.c index 988552dece75..5178c4630d89 100644 --- a/drivers/net/wireless/mwifiex/cfp.c +++ b/drivers/net/wireless/mwifiex/cfp.c | |||
| @@ -415,7 +415,8 @@ u32 mwifiex_get_supported_rates(struct mwifiex_private *priv, u8 *rates) | |||
| 415 | u32 k = 0; | 415 | u32 k = 0; |
| 416 | struct mwifiex_adapter *adapter = priv->adapter; | 416 | struct mwifiex_adapter *adapter = priv->adapter; |
| 417 | 417 | ||
| 418 | if (priv->bss_mode == NL80211_IFTYPE_STATION) { | 418 | if (priv->bss_mode == NL80211_IFTYPE_STATION || |
| 419 | priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) { | ||
| 419 | switch (adapter->config_bands) { | 420 | switch (adapter->config_bands) { |
| 420 | case BAND_B: | 421 | case BAND_B: |
| 421 | dev_dbg(adapter->dev, "info: infra band=%d " | 422 | dev_dbg(adapter->dev, "info: infra band=%d " |
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c index 1c8a771e8e81..12e778159ec5 100644 --- a/drivers/net/wireless/mwifiex/join.c +++ b/drivers/net/wireless/mwifiex/join.c | |||
| @@ -1291,8 +1291,10 @@ int mwifiex_associate(struct mwifiex_private *priv, | |||
| 1291 | { | 1291 | { |
| 1292 | u8 current_bssid[ETH_ALEN]; | 1292 | u8 current_bssid[ETH_ALEN]; |
| 1293 | 1293 | ||
| 1294 | /* Return error if the adapter or table entry is not marked as infra */ | 1294 | /* Return error if the adapter is not STA role or table entry |
| 1295 | if ((priv->bss_mode != NL80211_IFTYPE_STATION) || | 1295 | * is not marked as infra. |
| 1296 | */ | ||
| 1297 | if ((GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) || | ||
| 1296 | (bss_desc->bss_mode != NL80211_IFTYPE_STATION)) | 1298 | (bss_desc->bss_mode != NL80211_IFTYPE_STATION)) |
| 1297 | return -1; | 1299 | return -1; |
| 1298 | 1300 | ||
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c index 5ef49f2e375a..09185c963248 100644 --- a/drivers/net/wireless/mwifiex/sdio.c +++ b/drivers/net/wireless/mwifiex/sdio.c | |||
| @@ -1639,8 +1639,8 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter, | |||
| 1639 | /* Allocate buffer and copy payload */ | 1639 | /* Allocate buffer and copy payload */ |
| 1640 | blk_size = MWIFIEX_SDIO_BLOCK_SIZE; | 1640 | blk_size = MWIFIEX_SDIO_BLOCK_SIZE; |
| 1641 | buf_block_len = (pkt_len + blk_size - 1) / blk_size; | 1641 | buf_block_len = (pkt_len + blk_size - 1) / blk_size; |
| 1642 | *(u16 *) &payload[0] = (u16) pkt_len; | 1642 | *(__le16 *)&payload[0] = cpu_to_le16((u16)pkt_len); |
| 1643 | *(u16 *) &payload[2] = type; | 1643 | *(__le16 *)&payload[2] = cpu_to_le16(type); |
| 1644 | 1644 | ||
| 1645 | /* | 1645 | /* |
| 1646 | * This is SDIO specific header | 1646 | * This is SDIO specific header |
diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c index 206c3e038072..8af97abf7108 100644 --- a/drivers/net/wireless/mwifiex/sta_ioctl.c +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c | |||
| @@ -257,10 +257,10 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, | |||
| 257 | goto done; | 257 | goto done; |
| 258 | } | 258 | } |
| 259 | 259 | ||
| 260 | if (priv->bss_mode == NL80211_IFTYPE_STATION) { | 260 | if (priv->bss_mode == NL80211_IFTYPE_STATION || |
| 261 | priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) { | ||
| 261 | u8 config_bands; | 262 | u8 config_bands; |
| 262 | 263 | ||
| 263 | /* Infra mode */ | ||
| 264 | ret = mwifiex_deauthenticate(priv, NULL); | 264 | ret = mwifiex_deauthenticate(priv, NULL); |
| 265 | if (ret) | 265 | if (ret) |
| 266 | goto done; | 266 | goto done; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 6c0a91ff963c..aa95c6cf3545 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
| @@ -936,13 +936,8 @@ void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index) | |||
| 936 | spin_unlock_irqrestore(&queue->index_lock, irqflags); | 936 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
| 937 | } | 937 | } |
| 938 | 938 | ||
| 939 | void rt2x00queue_pause_queue(struct data_queue *queue) | 939 | void rt2x00queue_pause_queue_nocheck(struct data_queue *queue) |
| 940 | { | 940 | { |
| 941 | if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) || | ||
| 942 | !test_bit(QUEUE_STARTED, &queue->flags) || | ||
| 943 | test_and_set_bit(QUEUE_PAUSED, &queue->flags)) | ||
| 944 | return; | ||
| 945 | |||
| 946 | switch (queue->qid) { | 941 | switch (queue->qid) { |
| 947 | case QID_AC_VO: | 942 | case QID_AC_VO: |
| 948 | case QID_AC_VI: | 943 | case QID_AC_VI: |
| @@ -958,6 +953,15 @@ void rt2x00queue_pause_queue(struct data_queue *queue) | |||
| 958 | break; | 953 | break; |
| 959 | } | 954 | } |
| 960 | } | 955 | } |
| 956 | void rt2x00queue_pause_queue(struct data_queue *queue) | ||
| 957 | { | ||
| 958 | if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) || | ||
| 959 | !test_bit(QUEUE_STARTED, &queue->flags) || | ||
| 960 | test_and_set_bit(QUEUE_PAUSED, &queue->flags)) | ||
| 961 | return; | ||
| 962 | |||
| 963 | rt2x00queue_pause_queue_nocheck(queue); | ||
| 964 | } | ||
| 961 | EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue); | 965 | EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue); |
| 962 | 966 | ||
| 963 | void rt2x00queue_unpause_queue(struct data_queue *queue) | 967 | void rt2x00queue_unpause_queue(struct data_queue *queue) |
| @@ -1019,7 +1023,7 @@ void rt2x00queue_stop_queue(struct data_queue *queue) | |||
| 1019 | return; | 1023 | return; |
| 1020 | } | 1024 | } |
| 1021 | 1025 | ||
| 1022 | rt2x00queue_pause_queue(queue); | 1026 | rt2x00queue_pause_queue_nocheck(queue); |
| 1023 | 1027 | ||
| 1024 | queue->rt2x00dev->ops->lib->stop_queue(queue); | 1028 | queue->rt2x00dev->ops->lib->stop_queue(queue); |
| 1025 | 1029 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 0741a1e919a5..9a4156845e93 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -973,7 +973,7 @@ struct net_device_ops { | |||
| 973 | gfp_t gfp); | 973 | gfp_t gfp); |
| 974 | void (*ndo_netpoll_cleanup)(struct net_device *dev); | 974 | void (*ndo_netpoll_cleanup)(struct net_device *dev); |
| 975 | #endif | 975 | #endif |
| 976 | #ifdef CONFIG_NET_LL_RX_POLL | 976 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 977 | int (*ndo_busy_poll)(struct napi_struct *dev); | 977 | int (*ndo_busy_poll)(struct napi_struct *dev); |
| 978 | #endif | 978 | #endif |
| 979 | int (*ndo_set_vf_mac)(struct net_device *dev, | 979 | int (*ndo_set_vf_mac)(struct net_device *dev, |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 5afefa01a13c..3b71a4e83642 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -501,7 +501,7 @@ struct sk_buff { | |||
| 501 | /* 7/9 bit hole (depending on ndisc_nodetype presence) */ | 501 | /* 7/9 bit hole (depending on ndisc_nodetype presence) */ |
| 502 | kmemcheck_bitfield_end(flags2); | 502 | kmemcheck_bitfield_end(flags2); |
| 503 | 503 | ||
| 504 | #if defined CONFIG_NET_DMA || defined CONFIG_NET_LL_RX_POLL | 504 | #if defined CONFIG_NET_DMA || defined CONFIG_NET_RX_BUSY_POLL |
| 505 | union { | 505 | union { |
| 506 | unsigned int napi_id; | 506 | unsigned int napi_id; |
| 507 | dma_cookie_t dma_cookie; | 507 | dma_cookie_t dma_cookie; |
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h index a14339c2985f..f18b91966d3d 100644 --- a/include/net/busy_poll.h +++ b/include/net/busy_poll.h | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #include <linux/netdevice.h> | 27 | #include <linux/netdevice.h> |
| 28 | #include <net/ip.h> | 28 | #include <net/ip.h> |
| 29 | 29 | ||
| 30 | #ifdef CONFIG_NET_LL_RX_POLL | 30 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 31 | 31 | ||
| 32 | struct napi_struct; | 32 | struct napi_struct; |
| 33 | extern unsigned int sysctl_net_busy_read __read_mostly; | 33 | extern unsigned int sysctl_net_busy_read __read_mostly; |
| @@ -146,7 +146,7 @@ static inline void sk_mark_napi_id(struct sock *sk, struct sk_buff *skb) | |||
| 146 | sk->sk_napi_id = skb->napi_id; | 146 | sk->sk_napi_id = skb->napi_id; |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | #else /* CONFIG_NET_LL_RX_POLL */ | 149 | #else /* CONFIG_NET_RX_BUSY_POLL */ |
| 150 | static inline unsigned long net_busy_loop_on(void) | 150 | static inline unsigned long net_busy_loop_on(void) |
| 151 | { | 151 | { |
| 152 | return 0; | 152 | return 0; |
| @@ -181,5 +181,10 @@ static inline bool busy_loop_timeout(unsigned long end_time) | |||
| 181 | return true; | 181 | return true; |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | #endif /* CONFIG_NET_LL_RX_POLL */ | 184 | static inline bool sk_busy_loop(struct sock *sk, int nonblock) |
| 185 | { | ||
| 186 | return false; | ||
| 187 | } | ||
| 188 | |||
| 189 | #endif /* CONFIG_NET_RX_BUSY_POLL */ | ||
| 185 | #endif /* _LINUX_NET_BUSY_POLL_H */ | 190 | #endif /* _LINUX_NET_BUSY_POLL_H */ |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 2a601e7da1bf..48ec25a7fcb6 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
| @@ -300,7 +300,7 @@ extern void inet6_rt_notify(int event, struct rt6_info *rt, | |||
| 300 | struct nl_info *info); | 300 | struct nl_info *info); |
| 301 | 301 | ||
| 302 | extern void fib6_run_gc(unsigned long expires, | 302 | extern void fib6_run_gc(unsigned long expires, |
| 303 | struct net *net); | 303 | struct net *net, bool force); |
| 304 | 304 | ||
| 305 | extern void fib6_gc_cleanup(void); | 305 | extern void fib6_gc_cleanup(void); |
| 306 | 306 | ||
diff --git a/include/net/ndisc.h b/include/net/ndisc.h index 949d77528f2f..6fea32340ae8 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h | |||
| @@ -119,7 +119,7 @@ extern struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len, | |||
| 119 | * if RFC 3831 IPv6-over-Fibre Channel is ever implemented it may | 119 | * if RFC 3831 IPv6-over-Fibre Channel is ever implemented it may |
| 120 | * also need a pad of 2. | 120 | * also need a pad of 2. |
| 121 | */ | 121 | */ |
| 122 | static int ndisc_addr_option_pad(unsigned short type) | 122 | static inline int ndisc_addr_option_pad(unsigned short type) |
| 123 | { | 123 | { |
| 124 | switch (type) { | 124 | switch (type) { |
| 125 | case ARPHRD_INFINIBAND: return 2; | 125 | case ARPHRD_INFINIBAND: return 2; |
diff --git a/include/net/nfc/hci.h b/include/net/nfc/hci.h index 0af851c3b038..b64b7bce4b94 100644 --- a/include/net/nfc/hci.h +++ b/include/net/nfc/hci.h | |||
| @@ -59,7 +59,7 @@ struct nfc_hci_ops { | |||
| 59 | struct nfc_target *target); | 59 | struct nfc_target *target); |
| 60 | int (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event, | 60 | int (*event_received)(struct nfc_hci_dev *hdev, u8 gate, u8 event, |
| 61 | struct sk_buff *skb); | 61 | struct sk_buff *skb); |
| 62 | int (*fw_upload)(struct nfc_hci_dev *hdev, const char *firmware_name); | 62 | int (*fw_download)(struct nfc_hci_dev *hdev, const char *firmware_name); |
| 63 | int (*discover_se)(struct nfc_hci_dev *dev); | 63 | int (*discover_se)(struct nfc_hci_dev *dev); |
| 64 | int (*enable_se)(struct nfc_hci_dev *dev, u32 se_idx); | 64 | int (*enable_se)(struct nfc_hci_dev *dev, u32 se_idx); |
| 65 | int (*disable_se)(struct nfc_hci_dev *dev, u32 se_idx); | 65 | int (*disable_se)(struct nfc_hci_dev *dev, u32 se_idx); |
diff --git a/include/net/nfc/nfc.h b/include/net/nfc/nfc.h index 0e353f1658bb..5f286b726bb6 100644 --- a/include/net/nfc/nfc.h +++ b/include/net/nfc/nfc.h | |||
| @@ -68,7 +68,7 @@ struct nfc_ops { | |||
| 68 | void *cb_context); | 68 | void *cb_context); |
| 69 | int (*tm_send)(struct nfc_dev *dev, struct sk_buff *skb); | 69 | int (*tm_send)(struct nfc_dev *dev, struct sk_buff *skb); |
| 70 | int (*check_presence)(struct nfc_dev *dev, struct nfc_target *target); | 70 | int (*check_presence)(struct nfc_dev *dev, struct nfc_target *target); |
| 71 | int (*fw_upload)(struct nfc_dev *dev, const char *firmware_name); | 71 | int (*fw_download)(struct nfc_dev *dev, const char *firmware_name); |
| 72 | 72 | ||
| 73 | /* Secure Element API */ | 73 | /* Secure Element API */ |
| 74 | int (*discover_se)(struct nfc_dev *dev); | 74 | int (*discover_se)(struct nfc_dev *dev); |
| @@ -127,7 +127,7 @@ struct nfc_dev { | |||
| 127 | int targets_generation; | 127 | int targets_generation; |
| 128 | struct device dev; | 128 | struct device dev; |
| 129 | bool dev_up; | 129 | bool dev_up; |
| 130 | bool fw_upload_in_progress; | 130 | bool fw_download_in_progress; |
| 131 | u8 rf_mode; | 131 | u8 rf_mode; |
| 132 | bool polling; | 132 | bool polling; |
| 133 | struct nfc_target *active_target; | 133 | struct nfc_target *active_target; |
diff --git a/include/net/sock.h b/include/net/sock.h index 95a5a2c6925a..31d5cfbb51ec 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -327,7 +327,7 @@ struct sock { | |||
| 327 | #ifdef CONFIG_RPS | 327 | #ifdef CONFIG_RPS |
| 328 | __u32 sk_rxhash; | 328 | __u32 sk_rxhash; |
| 329 | #endif | 329 | #endif |
| 330 | #ifdef CONFIG_NET_LL_RX_POLL | 330 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 331 | unsigned int sk_napi_id; | 331 | unsigned int sk_napi_id; |
| 332 | unsigned int sk_ll_usec; | 332 | unsigned int sk_ll_usec; |
| 333 | #endif | 333 | #endif |
diff --git a/include/uapi/linux/nfc.h b/include/uapi/linux/nfc.h index caed0f324d5f..8137dd8d2adf 100644 --- a/include/uapi/linux/nfc.h +++ b/include/uapi/linux/nfc.h | |||
| @@ -69,8 +69,8 @@ | |||
| 69 | * starting a poll from a device which has a secure element enabled means | 69 | * starting a poll from a device which has a secure element enabled means |
| 70 | * we want to do SE based card emulation. | 70 | * we want to do SE based card emulation. |
| 71 | * @NFC_CMD_DISABLE_SE: Disable the physical link to a specific secure element. | 71 | * @NFC_CMD_DISABLE_SE: Disable the physical link to a specific secure element. |
| 72 | * @NFC_CMD_FW_UPLOAD: Request to Load/flash firmware, or event to inform that | 72 | * @NFC_CMD_FW_DOWNLOAD: Request to Load/flash firmware, or event to inform |
| 73 | * some firmware was loaded | 73 | * that some firmware was loaded |
| 74 | */ | 74 | */ |
| 75 | enum nfc_commands { | 75 | enum nfc_commands { |
| 76 | NFC_CMD_UNSPEC, | 76 | NFC_CMD_UNSPEC, |
| @@ -94,7 +94,7 @@ enum nfc_commands { | |||
| 94 | NFC_CMD_DISABLE_SE, | 94 | NFC_CMD_DISABLE_SE, |
| 95 | NFC_CMD_LLC_SDREQ, | 95 | NFC_CMD_LLC_SDREQ, |
| 96 | NFC_EVENT_LLC_SDRES, | 96 | NFC_EVENT_LLC_SDRES, |
| 97 | NFC_CMD_FW_UPLOAD, | 97 | NFC_CMD_FW_DOWNLOAD, |
| 98 | NFC_EVENT_SE_ADDED, | 98 | NFC_EVENT_SE_ADDED, |
| 99 | NFC_EVENT_SE_REMOVED, | 99 | NFC_EVENT_SE_REMOVED, |
| 100 | /* private: internal use only */ | 100 | /* private: internal use only */ |
diff --git a/net/Kconfig b/net/Kconfig index 37702491abe9..2b406608a1a4 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
| @@ -244,7 +244,7 @@ config NETPRIO_CGROUP | |||
| 244 | Cgroup subsystem for use in assigning processes to network priorities on | 244 | Cgroup subsystem for use in assigning processes to network priorities on |
| 245 | a per-interface basis | 245 | a per-interface basis |
| 246 | 246 | ||
| 247 | config NET_LL_RX_POLL | 247 | config NET_RX_BUSY_POLL |
| 248 | boolean | 248 | boolean |
| 249 | default y | 249 | default y |
| 250 | 250 | ||
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index e3a349977595..cc27297da5a9 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
| @@ -513,7 +513,10 @@ static void hci_init2_req(struct hci_request *req, unsigned long opt) | |||
| 513 | 513 | ||
| 514 | hci_setup_event_mask(req); | 514 | hci_setup_event_mask(req); |
| 515 | 515 | ||
| 516 | if (hdev->hci_ver > BLUETOOTH_VER_1_1) | 516 | /* AVM Berlin (31), aka "BlueFRITZ!", doesn't support the read |
| 517 | * local supported commands HCI command. | ||
| 518 | */ | ||
| 519 | if (hdev->manufacturer != 31 && hdev->hci_ver > BLUETOOTH_VER_1_1) | ||
| 517 | hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); | 520 | hci_req_add(req, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); |
| 518 | 521 | ||
| 519 | if (lmp_ssp_capable(hdev)) { | 522 | if (lmp_ssp_capable(hdev)) { |
| @@ -2165,10 +2168,6 @@ int hci_register_dev(struct hci_dev *hdev) | |||
| 2165 | 2168 | ||
| 2166 | BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); | 2169 | BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); |
| 2167 | 2170 | ||
| 2168 | write_lock(&hci_dev_list_lock); | ||
| 2169 | list_add(&hdev->list, &hci_dev_list); | ||
| 2170 | write_unlock(&hci_dev_list_lock); | ||
| 2171 | |||
| 2172 | hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | | 2171 | hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND | |
| 2173 | WQ_MEM_RECLAIM, 1, hdev->name); | 2172 | WQ_MEM_RECLAIM, 1, hdev->name); |
| 2174 | if (!hdev->workqueue) { | 2173 | if (!hdev->workqueue) { |
| @@ -2203,6 +2202,10 @@ int hci_register_dev(struct hci_dev *hdev) | |||
| 2203 | if (hdev->dev_type != HCI_AMP) | 2202 | if (hdev->dev_type != HCI_AMP) |
| 2204 | set_bit(HCI_AUTO_OFF, &hdev->dev_flags); | 2203 | set_bit(HCI_AUTO_OFF, &hdev->dev_flags); |
| 2205 | 2204 | ||
| 2205 | write_lock(&hci_dev_list_lock); | ||
| 2206 | list_add(&hdev->list, &hci_dev_list); | ||
| 2207 | write_unlock(&hci_dev_list_lock); | ||
| 2208 | |||
| 2206 | hci_notify(hdev, HCI_DEV_REG); | 2209 | hci_notify(hdev, HCI_DEV_REG); |
| 2207 | hci_dev_hold(hdev); | 2210 | hci_dev_hold(hdev); |
| 2208 | 2211 | ||
| @@ -2215,9 +2218,6 @@ err_wqueue: | |||
| 2215 | destroy_workqueue(hdev->req_workqueue); | 2218 | destroy_workqueue(hdev->req_workqueue); |
| 2216 | err: | 2219 | err: |
| 2217 | ida_simple_remove(&hci_index_ida, hdev->id); | 2220 | ida_simple_remove(&hci_index_ida, hdev->id); |
| 2218 | write_lock(&hci_dev_list_lock); | ||
| 2219 | list_del(&hdev->list); | ||
| 2220 | write_unlock(&hci_dev_list_lock); | ||
| 2221 | 2221 | ||
| 2222 | return error; | 2222 | return error; |
| 2223 | } | 2223 | } |
| @@ -3399,8 +3399,16 @@ void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status) | |||
| 3399 | */ | 3399 | */ |
| 3400 | if (hdev->sent_cmd) { | 3400 | if (hdev->sent_cmd) { |
| 3401 | req_complete = bt_cb(hdev->sent_cmd)->req.complete; | 3401 | req_complete = bt_cb(hdev->sent_cmd)->req.complete; |
| 3402 | if (req_complete) | 3402 | |
| 3403 | if (req_complete) { | ||
| 3404 | /* We must set the complete callback to NULL to | ||
| 3405 | * avoid calling the callback more than once if | ||
| 3406 | * this function gets called again. | ||
| 3407 | */ | ||
| 3408 | bt_cb(hdev->sent_cmd)->req.complete = NULL; | ||
| 3409 | |||
| 3403 | goto call_complete; | 3410 | goto call_complete; |
| 3411 | } | ||
| 3404 | } | 3412 | } |
| 3405 | 3413 | ||
| 3406 | /* Remove all pending commands belonging to this request */ | 3414 | /* Remove all pending commands belonging to this request */ |
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 2ef66781fedb..69363bd37f64 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
| @@ -70,7 +70,8 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | mdst = br_mdb_get(br, skb, vid); | 72 | mdst = br_mdb_get(br, skb, vid); |
| 73 | if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) | 73 | if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && |
| 74 | br_multicast_querier_exists(br)) | ||
| 74 | br_multicast_deliver(mdst, skb); | 75 | br_multicast_deliver(mdst, skb); |
| 75 | else | 76 | else |
| 76 | br_flood_deliver(br, skb, false); | 77 | br_flood_deliver(br, skb, false); |
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 1b8b8b824cd7..8c561c0aa636 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
| @@ -101,7 +101,8 @@ int br_handle_frame_finish(struct sk_buff *skb) | |||
| 101 | unicast = false; | 101 | unicast = false; |
| 102 | } else if (is_multicast_ether_addr(dest)) { | 102 | } else if (is_multicast_ether_addr(dest)) { |
| 103 | mdst = br_mdb_get(br, skb, vid); | 103 | mdst = br_mdb_get(br, skb, vid); |
| 104 | if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) { | 104 | if ((mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) && |
| 105 | br_multicast_querier_exists(br)) { | ||
| 105 | if ((mdst && mdst->mglist) || | 106 | if ((mdst && mdst->mglist) || |
| 106 | br_multicast_is_router(br)) | 107 | br_multicast_is_router(br)) |
| 107 | skb2 = skb; | 108 | skb2 = skb; |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 4b99c9a27044..61c5e819380e 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
| @@ -1014,6 +1014,16 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, | |||
| 1014 | } | 1014 | } |
| 1015 | #endif | 1015 | #endif |
| 1016 | 1016 | ||
| 1017 | static void br_multicast_update_querier_timer(struct net_bridge *br, | ||
| 1018 | unsigned long max_delay) | ||
| 1019 | { | ||
| 1020 | if (!timer_pending(&br->multicast_querier_timer)) | ||
| 1021 | br->multicast_querier_delay_time = jiffies + max_delay; | ||
| 1022 | |||
| 1023 | mod_timer(&br->multicast_querier_timer, | ||
| 1024 | jiffies + br->multicast_querier_interval); | ||
| 1025 | } | ||
| 1026 | |||
| 1017 | /* | 1027 | /* |
| 1018 | * Add port to router_list | 1028 | * Add port to router_list |
| 1019 | * list is maintained ordered by pointer value | 1029 | * list is maintained ordered by pointer value |
| @@ -1064,11 +1074,11 @@ timer: | |||
| 1064 | 1074 | ||
| 1065 | static void br_multicast_query_received(struct net_bridge *br, | 1075 | static void br_multicast_query_received(struct net_bridge *br, |
| 1066 | struct net_bridge_port *port, | 1076 | struct net_bridge_port *port, |
| 1067 | int saddr) | 1077 | int saddr, |
| 1078 | unsigned long max_delay) | ||
| 1068 | { | 1079 | { |
| 1069 | if (saddr) | 1080 | if (saddr) |
| 1070 | mod_timer(&br->multicast_querier_timer, | 1081 | br_multicast_update_querier_timer(br, max_delay); |
| 1071 | jiffies + br->multicast_querier_interval); | ||
| 1072 | else if (timer_pending(&br->multicast_querier_timer)) | 1082 | else if (timer_pending(&br->multicast_querier_timer)) |
| 1073 | return; | 1083 | return; |
| 1074 | 1084 | ||
| @@ -1096,8 +1106,6 @@ static int br_ip4_multicast_query(struct net_bridge *br, | |||
| 1096 | (port && port->state == BR_STATE_DISABLED)) | 1106 | (port && port->state == BR_STATE_DISABLED)) |
| 1097 | goto out; | 1107 | goto out; |
| 1098 | 1108 | ||
| 1099 | br_multicast_query_received(br, port, !!iph->saddr); | ||
| 1100 | |||
| 1101 | group = ih->group; | 1109 | group = ih->group; |
| 1102 | 1110 | ||
| 1103 | if (skb->len == sizeof(*ih)) { | 1111 | if (skb->len == sizeof(*ih)) { |
| @@ -1121,6 +1129,8 @@ static int br_ip4_multicast_query(struct net_bridge *br, | |||
| 1121 | IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1; | 1129 | IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1; |
| 1122 | } | 1130 | } |
| 1123 | 1131 | ||
| 1132 | br_multicast_query_received(br, port, !!iph->saddr, max_delay); | ||
| 1133 | |||
| 1124 | if (!group) | 1134 | if (!group) |
| 1125 | goto out; | 1135 | goto out; |
| 1126 | 1136 | ||
| @@ -1176,8 +1186,6 @@ static int br_ip6_multicast_query(struct net_bridge *br, | |||
| 1176 | (port && port->state == BR_STATE_DISABLED)) | 1186 | (port && port->state == BR_STATE_DISABLED)) |
| 1177 | goto out; | 1187 | goto out; |
| 1178 | 1188 | ||
| 1179 | br_multicast_query_received(br, port, !ipv6_addr_any(&ip6h->saddr)); | ||
| 1180 | |||
| 1181 | if (skb->len == sizeof(*mld)) { | 1189 | if (skb->len == sizeof(*mld)) { |
| 1182 | if (!pskb_may_pull(skb, sizeof(*mld))) { | 1190 | if (!pskb_may_pull(skb, sizeof(*mld))) { |
| 1183 | err = -EINVAL; | 1191 | err = -EINVAL; |
| @@ -1198,6 +1206,9 @@ static int br_ip6_multicast_query(struct net_bridge *br, | |||
| 1198 | max_delay = mld2q->mld2q_mrc ? MLDV2_MRC(ntohs(mld2q->mld2q_mrc)) : 1; | 1206 | max_delay = mld2q->mld2q_mrc ? MLDV2_MRC(ntohs(mld2q->mld2q_mrc)) : 1; |
| 1199 | } | 1207 | } |
| 1200 | 1208 | ||
| 1209 | br_multicast_query_received(br, port, !ipv6_addr_any(&ip6h->saddr), | ||
| 1210 | max_delay); | ||
| 1211 | |||
| 1201 | if (!group) | 1212 | if (!group) |
| 1202 | goto out; | 1213 | goto out; |
| 1203 | 1214 | ||
| @@ -1643,6 +1654,8 @@ void br_multicast_init(struct net_bridge *br) | |||
| 1643 | br->multicast_querier_interval = 255 * HZ; | 1654 | br->multicast_querier_interval = 255 * HZ; |
| 1644 | br->multicast_membership_interval = 260 * HZ; | 1655 | br->multicast_membership_interval = 260 * HZ; |
| 1645 | 1656 | ||
| 1657 | br->multicast_querier_delay_time = 0; | ||
| 1658 | |||
| 1646 | spin_lock_init(&br->multicast_lock); | 1659 | spin_lock_init(&br->multicast_lock); |
| 1647 | setup_timer(&br->multicast_router_timer, | 1660 | setup_timer(&br->multicast_router_timer, |
| 1648 | br_multicast_local_router_expired, 0); | 1661 | br_multicast_local_router_expired, 0); |
| @@ -1831,6 +1844,8 @@ unlock: | |||
| 1831 | 1844 | ||
| 1832 | int br_multicast_set_querier(struct net_bridge *br, unsigned long val) | 1845 | int br_multicast_set_querier(struct net_bridge *br, unsigned long val) |
| 1833 | { | 1846 | { |
| 1847 | unsigned long max_delay; | ||
| 1848 | |||
| 1834 | val = !!val; | 1849 | val = !!val; |
| 1835 | 1850 | ||
| 1836 | spin_lock_bh(&br->multicast_lock); | 1851 | spin_lock_bh(&br->multicast_lock); |
| @@ -1838,8 +1853,14 @@ int br_multicast_set_querier(struct net_bridge *br, unsigned long val) | |||
| 1838 | goto unlock; | 1853 | goto unlock; |
| 1839 | 1854 | ||
| 1840 | br->multicast_querier = val; | 1855 | br->multicast_querier = val; |
| 1841 | if (val) | 1856 | if (!val) |
| 1842 | br_multicast_start_querier(br); | 1857 | goto unlock; |
| 1858 | |||
| 1859 | max_delay = br->multicast_query_response_interval; | ||
| 1860 | if (!timer_pending(&br->multicast_querier_timer)) | ||
| 1861 | br->multicast_querier_delay_time = jiffies + max_delay; | ||
| 1862 | |||
| 1863 | br_multicast_start_querier(br); | ||
| 1843 | 1864 | ||
| 1844 | unlock: | 1865 | unlock: |
| 1845 | spin_unlock_bh(&br->multicast_lock); | 1866 | spin_unlock_bh(&br->multicast_lock); |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 3be89b3ce17b..2f7da41851bf 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
| @@ -267,6 +267,7 @@ struct net_bridge | |||
| 267 | unsigned long multicast_query_interval; | 267 | unsigned long multicast_query_interval; |
| 268 | unsigned long multicast_query_response_interval; | 268 | unsigned long multicast_query_response_interval; |
| 269 | unsigned long multicast_startup_query_interval; | 269 | unsigned long multicast_startup_query_interval; |
| 270 | unsigned long multicast_querier_delay_time; | ||
| 270 | 271 | ||
| 271 | spinlock_t multicast_lock; | 272 | spinlock_t multicast_lock; |
| 272 | struct net_bridge_mdb_htable __rcu *mdb; | 273 | struct net_bridge_mdb_htable __rcu *mdb; |
| @@ -501,6 +502,13 @@ static inline bool br_multicast_is_router(struct net_bridge *br) | |||
| 501 | (br->multicast_router == 1 && | 502 | (br->multicast_router == 1 && |
| 502 | timer_pending(&br->multicast_router_timer)); | 503 | timer_pending(&br->multicast_router_timer)); |
| 503 | } | 504 | } |
| 505 | |||
| 506 | static inline bool br_multicast_querier_exists(struct net_bridge *br) | ||
| 507 | { | ||
| 508 | return time_is_before_jiffies(br->multicast_querier_delay_time) && | ||
| 509 | (br->multicast_querier || | ||
| 510 | timer_pending(&br->multicast_querier_timer)); | ||
| 511 | } | ||
| 504 | #else | 512 | #else |
| 505 | static inline int br_multicast_rcv(struct net_bridge *br, | 513 | static inline int br_multicast_rcv(struct net_bridge *br, |
| 506 | struct net_bridge_port *port, | 514 | struct net_bridge_port *port, |
| @@ -557,6 +565,10 @@ static inline bool br_multicast_is_router(struct net_bridge *br) | |||
| 557 | { | 565 | { |
| 558 | return 0; | 566 | return 0; |
| 559 | } | 567 | } |
| 568 | static inline bool br_multicast_querier_exists(struct net_bridge *br) | ||
| 569 | { | ||
| 570 | return false; | ||
| 571 | } | ||
| 560 | static inline void br_mdb_init(void) | 572 | static inline void br_mdb_init(void) |
| 561 | { | 573 | { |
| 562 | } | 574 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 3df4d4ccf440..2c3d0f53d198 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -740,7 +740,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
| 740 | 740 | ||
| 741 | skb_copy_secmark(new, old); | 741 | skb_copy_secmark(new, old); |
| 742 | 742 | ||
| 743 | #ifdef CONFIG_NET_LL_RX_POLL | 743 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 744 | new->napi_id = old->napi_id; | 744 | new->napi_id = old->napi_id; |
| 745 | #endif | 745 | #endif |
| 746 | } | 746 | } |
diff --git a/net/core/sock.c b/net/core/sock.c index 548d716c5f62..2c097c5a35dd 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -900,7 +900,7 @@ set_rcvbuf: | |||
| 900 | sock_valbool_flag(sk, SOCK_SELECT_ERR_QUEUE, valbool); | 900 | sock_valbool_flag(sk, SOCK_SELECT_ERR_QUEUE, valbool); |
| 901 | break; | 901 | break; |
| 902 | 902 | ||
| 903 | #ifdef CONFIG_NET_LL_RX_POLL | 903 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 904 | case SO_BUSY_POLL: | 904 | case SO_BUSY_POLL: |
| 905 | /* allow unprivileged users to decrease the value */ | 905 | /* allow unprivileged users to decrease the value */ |
| 906 | if ((val > sk->sk_ll_usec) && !capable(CAP_NET_ADMIN)) | 906 | if ((val > sk->sk_ll_usec) && !capable(CAP_NET_ADMIN)) |
| @@ -1170,7 +1170,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
| 1170 | v.val = sock_flag(sk, SOCK_SELECT_ERR_QUEUE); | 1170 | v.val = sock_flag(sk, SOCK_SELECT_ERR_QUEUE); |
| 1171 | break; | 1171 | break; |
| 1172 | 1172 | ||
| 1173 | #ifdef CONFIG_NET_LL_RX_POLL | 1173 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 1174 | case SO_BUSY_POLL: | 1174 | case SO_BUSY_POLL: |
| 1175 | v.val = sk->sk_ll_usec; | 1175 | v.val = sk->sk_ll_usec; |
| 1176 | break; | 1176 | break; |
| @@ -2292,7 +2292,7 @@ void sock_init_data(struct socket *sock, struct sock *sk) | |||
| 2292 | 2292 | ||
| 2293 | sk->sk_stamp = ktime_set(-1L, 0); | 2293 | sk->sk_stamp = ktime_set(-1L, 0); |
| 2294 | 2294 | ||
| 2295 | #ifdef CONFIG_NET_LL_RX_POLL | 2295 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 2296 | sk->sk_napi_id = 0; | 2296 | sk->sk_napi_id = 0; |
| 2297 | sk->sk_ll_usec = sysctl_net_busy_read; | 2297 | sk->sk_ll_usec = sysctl_net_busy_read; |
| 2298 | #endif | 2298 | #endif |
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index 660968616637..31107abd2783 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c | |||
| @@ -21,7 +21,9 @@ | |||
| 21 | #include <net/net_ratelimit.h> | 21 | #include <net/net_ratelimit.h> |
| 22 | #include <net/busy_poll.h> | 22 | #include <net/busy_poll.h> |
| 23 | 23 | ||
| 24 | static int zero = 0; | ||
| 24 | static int one = 1; | 25 | static int one = 1; |
| 26 | static int ushort_max = USHRT_MAX; | ||
| 25 | 27 | ||
| 26 | #ifdef CONFIG_RPS | 28 | #ifdef CONFIG_RPS |
| 27 | static int rps_sock_flow_sysctl(struct ctl_table *table, int write, | 29 | static int rps_sock_flow_sysctl(struct ctl_table *table, int write, |
| @@ -298,7 +300,7 @@ static struct ctl_table net_core_table[] = { | |||
| 298 | .proc_handler = flow_limit_table_len_sysctl | 300 | .proc_handler = flow_limit_table_len_sysctl |
| 299 | }, | 301 | }, |
| 300 | #endif /* CONFIG_NET_FLOW_LIMIT */ | 302 | #endif /* CONFIG_NET_FLOW_LIMIT */ |
| 301 | #ifdef CONFIG_NET_LL_RX_POLL | 303 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 302 | { | 304 | { |
| 303 | .procname = "busy_poll", | 305 | .procname = "busy_poll", |
| 304 | .data = &sysctl_net_busy_poll, | 306 | .data = &sysctl_net_busy_poll, |
| @@ -339,7 +341,9 @@ static struct ctl_table netns_core_table[] = { | |||
| 339 | .data = &init_net.core.sysctl_somaxconn, | 341 | .data = &init_net.core.sysctl_somaxconn, |
| 340 | .maxlen = sizeof(int), | 342 | .maxlen = sizeof(int), |
| 341 | .mode = 0644, | 343 | .mode = 0644, |
| 342 | .proc_handler = proc_dointvec | 344 | .extra1 = &zero, |
| 345 | .extra2 = &ushort_max, | ||
| 346 | .proc_handler = proc_dointvec_minmax | ||
| 343 | }, | 347 | }, |
| 344 | { } | 348 | { } |
| 345 | }; | 349 | }; |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 8d48c392adcc..34ca6d5a3a4b 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -772,7 +772,7 @@ static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh, | |||
| 772 | ci = nla_data(tb[IFA_CACHEINFO]); | 772 | ci = nla_data(tb[IFA_CACHEINFO]); |
| 773 | if (!ci->ifa_valid || ci->ifa_prefered > ci->ifa_valid) { | 773 | if (!ci->ifa_valid || ci->ifa_prefered > ci->ifa_valid) { |
| 774 | err = -EINVAL; | 774 | err = -EINVAL; |
| 775 | goto errout; | 775 | goto errout_free; |
| 776 | } | 776 | } |
| 777 | *pvalid_lft = ci->ifa_valid; | 777 | *pvalid_lft = ci->ifa_valid; |
| 778 | *pprefered_lft = ci->ifa_prefered; | 778 | *pprefered_lft = ci->ifa_prefered; |
| @@ -780,6 +780,8 @@ static struct in_ifaddr *rtm_to_ifaddr(struct net *net, struct nlmsghdr *nlh, | |||
| 780 | 780 | ||
| 781 | return ifa; | 781 | return ifa; |
| 782 | 782 | ||
| 783 | errout_free: | ||
| 784 | inet_free_ifa(ifa); | ||
| 783 | errout: | 785 | errout: |
| 784 | return ERR_PTR(err); | 786 | return ERR_PTR(err); |
| 785 | } | 787 | } |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index cfdcf7b2daf6..da4241c8c7da 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -813,8 +813,9 @@ static u32 inet6_addr_hash(const struct in6_addr *addr) | |||
| 813 | /* On success it returns ifp with increased reference count */ | 813 | /* On success it returns ifp with increased reference count */ |
| 814 | 814 | ||
| 815 | static struct inet6_ifaddr * | 815 | static struct inet6_ifaddr * |
| 816 | ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | 816 | ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, |
| 817 | int scope, u32 flags) | 817 | const struct in6_addr *peer_addr, int pfxlen, |
| 818 | int scope, u32 flags, u32 valid_lft, u32 prefered_lft) | ||
| 818 | { | 819 | { |
| 819 | struct inet6_ifaddr *ifa = NULL; | 820 | struct inet6_ifaddr *ifa = NULL; |
| 820 | struct rt6_info *rt; | 821 | struct rt6_info *rt; |
| @@ -863,6 +864,8 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
| 863 | } | 864 | } |
| 864 | 865 | ||
| 865 | ifa->addr = *addr; | 866 | ifa->addr = *addr; |
| 867 | if (peer_addr) | ||
| 868 | ifa->peer_addr = *peer_addr; | ||
| 866 | 869 | ||
| 867 | spin_lock_init(&ifa->lock); | 870 | spin_lock_init(&ifa->lock); |
| 868 | spin_lock_init(&ifa->state_lock); | 871 | spin_lock_init(&ifa->state_lock); |
| @@ -872,6 +875,8 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
| 872 | ifa->scope = scope; | 875 | ifa->scope = scope; |
| 873 | ifa->prefix_len = pfxlen; | 876 | ifa->prefix_len = pfxlen; |
| 874 | ifa->flags = flags | IFA_F_TENTATIVE; | 877 | ifa->flags = flags | IFA_F_TENTATIVE; |
| 878 | ifa->valid_lft = valid_lft; | ||
| 879 | ifa->prefered_lft = prefered_lft; | ||
| 875 | ifa->cstamp = ifa->tstamp = jiffies; | 880 | ifa->cstamp = ifa->tstamp = jiffies; |
| 876 | ifa->tokenized = false; | 881 | ifa->tokenized = false; |
| 877 | 882 | ||
| @@ -1123,8 +1128,9 @@ retry: | |||
| 1123 | 1128 | ||
| 1124 | ift = !max_addresses || | 1129 | ift = !max_addresses || |
| 1125 | ipv6_count_addresses(idev) < max_addresses ? | 1130 | ipv6_count_addresses(idev) < max_addresses ? |
| 1126 | ipv6_add_addr(idev, &addr, tmp_plen, ipv6_addr_scope(&addr), | 1131 | ipv6_add_addr(idev, &addr, NULL, tmp_plen, |
| 1127 | addr_flags) : NULL; | 1132 | ipv6_addr_scope(&addr), addr_flags, |
| 1133 | tmp_valid_lft, tmp_prefered_lft) : NULL; | ||
| 1128 | if (IS_ERR_OR_NULL(ift)) { | 1134 | if (IS_ERR_OR_NULL(ift)) { |
| 1129 | in6_ifa_put(ifp); | 1135 | in6_ifa_put(ifp); |
| 1130 | in6_dev_put(idev); | 1136 | in6_dev_put(idev); |
| @@ -1136,8 +1142,6 @@ retry: | |||
| 1136 | 1142 | ||
| 1137 | spin_lock_bh(&ift->lock); | 1143 | spin_lock_bh(&ift->lock); |
| 1138 | ift->ifpub = ifp; | 1144 | ift->ifpub = ifp; |
| 1139 | ift->valid_lft = tmp_valid_lft; | ||
| 1140 | ift->prefered_lft = tmp_prefered_lft; | ||
| 1141 | ift->cstamp = now; | 1145 | ift->cstamp = now; |
| 1142 | ift->tstamp = tmp_tstamp; | 1146 | ift->tstamp = tmp_tstamp; |
| 1143 | spin_unlock_bh(&ift->lock); | 1147 | spin_unlock_bh(&ift->lock); |
| @@ -2179,16 +2183,19 @@ ok: | |||
| 2179 | */ | 2183 | */ |
| 2180 | if (!max_addresses || | 2184 | if (!max_addresses || |
| 2181 | ipv6_count_addresses(in6_dev) < max_addresses) | 2185 | ipv6_count_addresses(in6_dev) < max_addresses) |
| 2182 | ifp = ipv6_add_addr(in6_dev, &addr, pinfo->prefix_len, | 2186 | ifp = ipv6_add_addr(in6_dev, &addr, NULL, |
| 2187 | pinfo->prefix_len, | ||
| 2183 | addr_type&IPV6_ADDR_SCOPE_MASK, | 2188 | addr_type&IPV6_ADDR_SCOPE_MASK, |
| 2184 | addr_flags); | 2189 | addr_flags, valid_lft, |
| 2190 | prefered_lft); | ||
| 2185 | 2191 | ||
| 2186 | if (IS_ERR_OR_NULL(ifp)) { | 2192 | if (IS_ERR_OR_NULL(ifp)) { |
| 2187 | in6_dev_put(in6_dev); | 2193 | in6_dev_put(in6_dev); |
| 2188 | return; | 2194 | return; |
| 2189 | } | 2195 | } |
| 2190 | 2196 | ||
| 2191 | update_lft = create = 1; | 2197 | update_lft = 0; |
| 2198 | create = 1; | ||
| 2192 | ifp->cstamp = jiffies; | 2199 | ifp->cstamp = jiffies; |
| 2193 | ifp->tokenized = tokenized; | 2200 | ifp->tokenized = tokenized; |
| 2194 | addrconf_dad_start(ifp); | 2201 | addrconf_dad_start(ifp); |
| @@ -2209,7 +2216,7 @@ ok: | |||
| 2209 | stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; | 2216 | stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ; |
| 2210 | else | 2217 | else |
| 2211 | stored_lft = 0; | 2218 | stored_lft = 0; |
| 2212 | if (!update_lft && stored_lft) { | 2219 | if (!update_lft && !create && stored_lft) { |
| 2213 | if (valid_lft > MIN_VALID_LIFETIME || | 2220 | if (valid_lft > MIN_VALID_LIFETIME || |
| 2214 | valid_lft > stored_lft) | 2221 | valid_lft > stored_lft) |
| 2215 | update_lft = 1; | 2222 | update_lft = 1; |
| @@ -2455,17 +2462,10 @@ static int inet6_addr_add(struct net *net, int ifindex, const struct in6_addr *p | |||
| 2455 | prefered_lft = timeout; | 2462 | prefered_lft = timeout; |
| 2456 | } | 2463 | } |
| 2457 | 2464 | ||
| 2458 | ifp = ipv6_add_addr(idev, pfx, plen, scope, ifa_flags); | 2465 | ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags, |
| 2466 | valid_lft, prefered_lft); | ||
| 2459 | 2467 | ||
| 2460 | if (!IS_ERR(ifp)) { | 2468 | if (!IS_ERR(ifp)) { |
| 2461 | spin_lock_bh(&ifp->lock); | ||
| 2462 | ifp->valid_lft = valid_lft; | ||
| 2463 | ifp->prefered_lft = prefered_lft; | ||
| 2464 | ifp->tstamp = jiffies; | ||
| 2465 | if (peer_pfx) | ||
| 2466 | ifp->peer_addr = *peer_pfx; | ||
| 2467 | spin_unlock_bh(&ifp->lock); | ||
| 2468 | |||
| 2469 | addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, | 2469 | addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, |
| 2470 | expires, flags); | 2470 | expires, flags); |
| 2471 | /* | 2471 | /* |
| @@ -2557,7 +2557,8 @@ static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr, | |||
| 2557 | { | 2557 | { |
| 2558 | struct inet6_ifaddr *ifp; | 2558 | struct inet6_ifaddr *ifp; |
| 2559 | 2559 | ||
| 2560 | ifp = ipv6_add_addr(idev, addr, plen, scope, IFA_F_PERMANENT); | 2560 | ifp = ipv6_add_addr(idev, addr, NULL, plen, |
| 2561 | scope, IFA_F_PERMANENT, 0, 0); | ||
| 2561 | if (!IS_ERR(ifp)) { | 2562 | if (!IS_ERR(ifp)) { |
| 2562 | spin_lock_bh(&ifp->lock); | 2563 | spin_lock_bh(&ifp->lock); |
| 2563 | ifp->flags &= ~IFA_F_TENTATIVE; | 2564 | ifp->flags &= ~IFA_F_TENTATIVE; |
| @@ -2683,7 +2684,7 @@ static void addrconf_add_linklocal(struct inet6_dev *idev, const struct in6_addr | |||
| 2683 | #endif | 2684 | #endif |
| 2684 | 2685 | ||
| 2685 | 2686 | ||
| 2686 | ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, addr_flags); | 2687 | ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags, 0, 0); |
| 2687 | if (!IS_ERR(ifp)) { | 2688 | if (!IS_ERR(ifp)) { |
| 2688 | addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); | 2689 | addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); |
| 2689 | addrconf_dad_start(ifp); | 2690 | addrconf_dad_start(ifp); |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 5fc9c7a68d8d..bff3d821c7eb 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -1632,27 +1632,28 @@ static int fib6_age(struct rt6_info *rt, void *arg) | |||
| 1632 | 1632 | ||
| 1633 | static DEFINE_SPINLOCK(fib6_gc_lock); | 1633 | static DEFINE_SPINLOCK(fib6_gc_lock); |
| 1634 | 1634 | ||
| 1635 | void fib6_run_gc(unsigned long expires, struct net *net) | 1635 | void fib6_run_gc(unsigned long expires, struct net *net, bool force) |
| 1636 | { | 1636 | { |
| 1637 | if (expires != ~0UL) { | 1637 | unsigned long now; |
| 1638 | |||
| 1639 | if (force) { | ||
| 1638 | spin_lock_bh(&fib6_gc_lock); | 1640 | spin_lock_bh(&fib6_gc_lock); |
| 1639 | gc_args.timeout = expires ? (int)expires : | 1641 | } else if (!spin_trylock_bh(&fib6_gc_lock)) { |
| 1640 | net->ipv6.sysctl.ip6_rt_gc_interval; | 1642 | mod_timer(&net->ipv6.ip6_fib_timer, jiffies + HZ); |
| 1641 | } else { | 1643 | return; |
| 1642 | if (!spin_trylock_bh(&fib6_gc_lock)) { | ||
| 1643 | mod_timer(&net->ipv6.ip6_fib_timer, jiffies + HZ); | ||
| 1644 | return; | ||
| 1645 | } | ||
| 1646 | gc_args.timeout = net->ipv6.sysctl.ip6_rt_gc_interval; | ||
| 1647 | } | 1644 | } |
| 1645 | gc_args.timeout = expires ? (int)expires : | ||
| 1646 | net->ipv6.sysctl.ip6_rt_gc_interval; | ||
| 1648 | 1647 | ||
| 1649 | gc_args.more = icmp6_dst_gc(); | 1648 | gc_args.more = icmp6_dst_gc(); |
| 1650 | 1649 | ||
| 1651 | fib6_clean_all(net, fib6_age, 0, NULL); | 1650 | fib6_clean_all(net, fib6_age, 0, NULL); |
| 1651 | now = jiffies; | ||
| 1652 | net->ipv6.ip6_rt_last_gc = now; | ||
| 1652 | 1653 | ||
| 1653 | if (gc_args.more) | 1654 | if (gc_args.more) |
| 1654 | mod_timer(&net->ipv6.ip6_fib_timer, | 1655 | mod_timer(&net->ipv6.ip6_fib_timer, |
| 1655 | round_jiffies(jiffies | 1656 | round_jiffies(now |
| 1656 | + net->ipv6.sysctl.ip6_rt_gc_interval)); | 1657 | + net->ipv6.sysctl.ip6_rt_gc_interval)); |
| 1657 | else | 1658 | else |
| 1658 | del_timer(&net->ipv6.ip6_fib_timer); | 1659 | del_timer(&net->ipv6.ip6_fib_timer); |
| @@ -1661,7 +1662,7 @@ void fib6_run_gc(unsigned long expires, struct net *net) | |||
| 1661 | 1662 | ||
| 1662 | static void fib6_gc_timer_cb(unsigned long arg) | 1663 | static void fib6_gc_timer_cb(unsigned long arg) |
| 1663 | { | 1664 | { |
| 1664 | fib6_run_gc(0, (struct net *)arg); | 1665 | fib6_run_gc(0, (struct net *)arg, true); |
| 1665 | } | 1666 | } |
| 1666 | 1667 | ||
| 1667 | static int __net_init fib6_net_init(struct net *net) | 1668 | static int __net_init fib6_net_init(struct net *net) |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 24c03396e008..79aa9652ed86 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -1576,7 +1576,7 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, | |||
| 1576 | switch (event) { | 1576 | switch (event) { |
| 1577 | case NETDEV_CHANGEADDR: | 1577 | case NETDEV_CHANGEADDR: |
| 1578 | neigh_changeaddr(&nd_tbl, dev); | 1578 | neigh_changeaddr(&nd_tbl, dev); |
| 1579 | fib6_run_gc(~0UL, net); | 1579 | fib6_run_gc(0, net, false); |
| 1580 | idev = in6_dev_get(dev); | 1580 | idev = in6_dev_get(dev); |
| 1581 | if (!idev) | 1581 | if (!idev) |
| 1582 | break; | 1582 | break; |
| @@ -1586,7 +1586,7 @@ static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, | |||
| 1586 | break; | 1586 | break; |
| 1587 | case NETDEV_DOWN: | 1587 | case NETDEV_DOWN: |
| 1588 | neigh_ifdown(&nd_tbl, dev); | 1588 | neigh_ifdown(&nd_tbl, dev); |
| 1589 | fib6_run_gc(~0UL, net); | 1589 | fib6_run_gc(0, net, false); |
| 1590 | break; | 1590 | break; |
| 1591 | case NETDEV_NOTIFY_PEERS: | 1591 | case NETDEV_NOTIFY_PEERS: |
| 1592 | ndisc_send_unsol_na(dev); | 1592 | ndisc_send_unsol_na(dev); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index a8c891aa2464..b70f8979003b 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -1311,7 +1311,6 @@ static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg), | |||
| 1311 | 1311 | ||
| 1312 | static int ip6_dst_gc(struct dst_ops *ops) | 1312 | static int ip6_dst_gc(struct dst_ops *ops) |
| 1313 | { | 1313 | { |
| 1314 | unsigned long now = jiffies; | ||
| 1315 | struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops); | 1314 | struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops); |
| 1316 | int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval; | 1315 | int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval; |
| 1317 | int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size; | 1316 | int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size; |
| @@ -1321,13 +1320,12 @@ static int ip6_dst_gc(struct dst_ops *ops) | |||
| 1321 | int entries; | 1320 | int entries; |
| 1322 | 1321 | ||
| 1323 | entries = dst_entries_get_fast(ops); | 1322 | entries = dst_entries_get_fast(ops); |
| 1324 | if (time_after(rt_last_gc + rt_min_interval, now) && | 1323 | if (time_after(rt_last_gc + rt_min_interval, jiffies) && |
| 1325 | entries <= rt_max_size) | 1324 | entries <= rt_max_size) |
| 1326 | goto out; | 1325 | goto out; |
| 1327 | 1326 | ||
| 1328 | net->ipv6.ip6_rt_gc_expire++; | 1327 | net->ipv6.ip6_rt_gc_expire++; |
| 1329 | fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net); | 1328 | fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net, entries > rt_max_size); |
| 1330 | net->ipv6.ip6_rt_last_gc = now; | ||
| 1331 | entries = dst_entries_get_slow(ops); | 1329 | entries = dst_entries_get_slow(ops); |
| 1332 | if (entries < ops->gc_thresh) | 1330 | if (entries < ops->gc_thresh) |
| 1333 | net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1; | 1331 | net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1; |
| @@ -2827,7 +2825,7 @@ int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write, | |||
| 2827 | net = (struct net *)ctl->extra1; | 2825 | net = (struct net *)ctl->extra1; |
| 2828 | delay = net->ipv6.sysctl.flush_delay; | 2826 | delay = net->ipv6.sysctl.flush_delay; |
| 2829 | proc_dointvec(ctl, write, buffer, lenp, ppos); | 2827 | proc_dointvec(ctl, write, buffer, lenp, ppos); |
| 2830 | fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net); | 2828 | fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0); |
| 2831 | return 0; | 2829 | return 0; |
| 2832 | } | 2830 | } |
| 2833 | 2831 | ||
diff --git a/net/mac80211/mesh_ps.c b/net/mac80211/mesh_ps.c index 3b7bfc01ee36..22290a929b94 100644 --- a/net/mac80211/mesh_ps.c +++ b/net/mac80211/mesh_ps.c | |||
| @@ -229,6 +229,10 @@ void ieee80211_mps_sta_status_update(struct sta_info *sta) | |||
| 229 | enum nl80211_mesh_power_mode pm; | 229 | enum nl80211_mesh_power_mode pm; |
| 230 | bool do_buffer; | 230 | bool do_buffer; |
| 231 | 231 | ||
| 232 | /* For non-assoc STA, prevent buffering or frame transmission */ | ||
| 233 | if (sta->sta_state < IEEE80211_STA_ASSOC) | ||
| 234 | return; | ||
| 235 | |||
| 232 | /* | 236 | /* |
| 233 | * use peer-specific power mode if peering is established and the | 237 | * use peer-specific power mode if peering is established and the |
| 234 | * peer's power mode is known | 238 | * peer's power mode is known |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 7fc5d0d8149a..340126204343 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
| @@ -99,10 +99,13 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
| 99 | } | 99 | } |
| 100 | mutex_unlock(&local->sta_mtx); | 100 | mutex_unlock(&local->sta_mtx); |
| 101 | 101 | ||
| 102 | /* remove all interfaces */ | 102 | /* remove all interfaces that were created in the driver */ |
| 103 | list_for_each_entry(sdata, &local->interfaces, list) { | 103 | list_for_each_entry(sdata, &local->interfaces, list) { |
| 104 | if (!ieee80211_sdata_running(sdata)) | 104 | if (!ieee80211_sdata_running(sdata) || |
| 105 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN || | ||
| 106 | sdata->vif.type == NL80211_IFTYPE_MONITOR) | ||
| 105 | continue; | 107 | continue; |
| 108 | |||
| 106 | drv_remove_interface(local, sdata); | 109 | drv_remove_interface(local, sdata); |
| 107 | } | 110 | } |
| 108 | 111 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index c15042f987bd..a1100640495d 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c | |||
| @@ -691,8 +691,8 @@ static int netlbl_cipsov4_remove_cb(struct netlbl_dom_map *entry, void *arg) | |||
| 691 | { | 691 | { |
| 692 | struct netlbl_domhsh_walk_arg *cb_arg = arg; | 692 | struct netlbl_domhsh_walk_arg *cb_arg = arg; |
| 693 | 693 | ||
| 694 | if (entry->type == NETLBL_NLTYPE_CIPSOV4 && | 694 | if (entry->def.type == NETLBL_NLTYPE_CIPSOV4 && |
| 695 | entry->type_def.cipsov4->doi == cb_arg->doi) | 695 | entry->def.cipso->doi == cb_arg->doi) |
| 696 | return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info); | 696 | return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info); |
| 697 | 697 | ||
| 698 | return 0; | 698 | return 0; |
diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c index 6bb1d42f0fac..85d842e6e431 100644 --- a/net/netlabel/netlabel_domainhash.c +++ b/net/netlabel/netlabel_domainhash.c | |||
| @@ -84,15 +84,15 @@ static void netlbl_domhsh_free_entry(struct rcu_head *entry) | |||
| 84 | #endif /* IPv6 */ | 84 | #endif /* IPv6 */ |
| 85 | 85 | ||
| 86 | ptr = container_of(entry, struct netlbl_dom_map, rcu); | 86 | ptr = container_of(entry, struct netlbl_dom_map, rcu); |
| 87 | if (ptr->type == NETLBL_NLTYPE_ADDRSELECT) { | 87 | if (ptr->def.type == NETLBL_NLTYPE_ADDRSELECT) { |
| 88 | netlbl_af4list_foreach_safe(iter4, tmp4, | 88 | netlbl_af4list_foreach_safe(iter4, tmp4, |
| 89 | &ptr->type_def.addrsel->list4) { | 89 | &ptr->def.addrsel->list4) { |
| 90 | netlbl_af4list_remove_entry(iter4); | 90 | netlbl_af4list_remove_entry(iter4); |
| 91 | kfree(netlbl_domhsh_addr4_entry(iter4)); | 91 | kfree(netlbl_domhsh_addr4_entry(iter4)); |
| 92 | } | 92 | } |
| 93 | #if IS_ENABLED(CONFIG_IPV6) | 93 | #if IS_ENABLED(CONFIG_IPV6) |
| 94 | netlbl_af6list_foreach_safe(iter6, tmp6, | 94 | netlbl_af6list_foreach_safe(iter6, tmp6, |
| 95 | &ptr->type_def.addrsel->list6) { | 95 | &ptr->def.addrsel->list6) { |
| 96 | netlbl_af6list_remove_entry(iter6); | 96 | netlbl_af6list_remove_entry(iter6); |
| 97 | kfree(netlbl_domhsh_addr6_entry(iter6)); | 97 | kfree(netlbl_domhsh_addr6_entry(iter6)); |
| 98 | } | 98 | } |
| @@ -213,21 +213,21 @@ static void netlbl_domhsh_audit_add(struct netlbl_dom_map *entry, | |||
| 213 | if (addr4 != NULL) { | 213 | if (addr4 != NULL) { |
| 214 | struct netlbl_domaddr4_map *map4; | 214 | struct netlbl_domaddr4_map *map4; |
| 215 | map4 = netlbl_domhsh_addr4_entry(addr4); | 215 | map4 = netlbl_domhsh_addr4_entry(addr4); |
| 216 | type = map4->type; | 216 | type = map4->def.type; |
| 217 | cipsov4 = map4->type_def.cipsov4; | 217 | cipsov4 = map4->def.cipso; |
| 218 | netlbl_af4list_audit_addr(audit_buf, 0, NULL, | 218 | netlbl_af4list_audit_addr(audit_buf, 0, NULL, |
| 219 | addr4->addr, addr4->mask); | 219 | addr4->addr, addr4->mask); |
| 220 | #if IS_ENABLED(CONFIG_IPV6) | 220 | #if IS_ENABLED(CONFIG_IPV6) |
| 221 | } else if (addr6 != NULL) { | 221 | } else if (addr6 != NULL) { |
| 222 | struct netlbl_domaddr6_map *map6; | 222 | struct netlbl_domaddr6_map *map6; |
| 223 | map6 = netlbl_domhsh_addr6_entry(addr6); | 223 | map6 = netlbl_domhsh_addr6_entry(addr6); |
| 224 | type = map6->type; | 224 | type = map6->def.type; |
| 225 | netlbl_af6list_audit_addr(audit_buf, 0, NULL, | 225 | netlbl_af6list_audit_addr(audit_buf, 0, NULL, |
| 226 | &addr6->addr, &addr6->mask); | 226 | &addr6->addr, &addr6->mask); |
| 227 | #endif /* IPv6 */ | 227 | #endif /* IPv6 */ |
| 228 | } else { | 228 | } else { |
| 229 | type = entry->type; | 229 | type = entry->def.type; |
| 230 | cipsov4 = entry->type_def.cipsov4; | 230 | cipsov4 = entry->def.cipso; |
| 231 | } | 231 | } |
| 232 | switch (type) { | 232 | switch (type) { |
| 233 | case NETLBL_NLTYPE_UNLABELED: | 233 | case NETLBL_NLTYPE_UNLABELED: |
| @@ -265,26 +265,25 @@ static int netlbl_domhsh_validate(const struct netlbl_dom_map *entry) | |||
| 265 | if (entry == NULL) | 265 | if (entry == NULL) |
| 266 | return -EINVAL; | 266 | return -EINVAL; |
| 267 | 267 | ||
| 268 | switch (entry->type) { | 268 | switch (entry->def.type) { |
| 269 | case NETLBL_NLTYPE_UNLABELED: | 269 | case NETLBL_NLTYPE_UNLABELED: |
| 270 | if (entry->type_def.cipsov4 != NULL || | 270 | if (entry->def.cipso != NULL || entry->def.addrsel != NULL) |
| 271 | entry->type_def.addrsel != NULL) | ||
| 272 | return -EINVAL; | 271 | return -EINVAL; |
| 273 | break; | 272 | break; |
| 274 | case NETLBL_NLTYPE_CIPSOV4: | 273 | case NETLBL_NLTYPE_CIPSOV4: |
| 275 | if (entry->type_def.cipsov4 == NULL) | 274 | if (entry->def.cipso == NULL) |
| 276 | return -EINVAL; | 275 | return -EINVAL; |
| 277 | break; | 276 | break; |
| 278 | case NETLBL_NLTYPE_ADDRSELECT: | 277 | case NETLBL_NLTYPE_ADDRSELECT: |
| 279 | netlbl_af4list_foreach(iter4, &entry->type_def.addrsel->list4) { | 278 | netlbl_af4list_foreach(iter4, &entry->def.addrsel->list4) { |
| 280 | map4 = netlbl_domhsh_addr4_entry(iter4); | 279 | map4 = netlbl_domhsh_addr4_entry(iter4); |
| 281 | switch (map4->type) { | 280 | switch (map4->def.type) { |
| 282 | case NETLBL_NLTYPE_UNLABELED: | 281 | case NETLBL_NLTYPE_UNLABELED: |
| 283 | if (map4->type_def.cipsov4 != NULL) | 282 | if (map4->def.cipso != NULL) |
| 284 | return -EINVAL; | 283 | return -EINVAL; |
| 285 | break; | 284 | break; |
| 286 | case NETLBL_NLTYPE_CIPSOV4: | 285 | case NETLBL_NLTYPE_CIPSOV4: |
| 287 | if (map4->type_def.cipsov4 == NULL) | 286 | if (map4->def.cipso == NULL) |
| 288 | return -EINVAL; | 287 | return -EINVAL; |
| 289 | break; | 288 | break; |
| 290 | default: | 289 | default: |
| @@ -292,9 +291,9 @@ static int netlbl_domhsh_validate(const struct netlbl_dom_map *entry) | |||
| 292 | } | 291 | } |
| 293 | } | 292 | } |
| 294 | #if IS_ENABLED(CONFIG_IPV6) | 293 | #if IS_ENABLED(CONFIG_IPV6) |
| 295 | netlbl_af6list_foreach(iter6, &entry->type_def.addrsel->list6) { | 294 | netlbl_af6list_foreach(iter6, &entry->def.addrsel->list6) { |
| 296 | map6 = netlbl_domhsh_addr6_entry(iter6); | 295 | map6 = netlbl_domhsh_addr6_entry(iter6); |
| 297 | switch (map6->type) { | 296 | switch (map6->def.type) { |
| 298 | case NETLBL_NLTYPE_UNLABELED: | 297 | case NETLBL_NLTYPE_UNLABELED: |
| 299 | break; | 298 | break; |
| 300 | default: | 299 | default: |
| @@ -402,32 +401,31 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, | |||
| 402 | rcu_assign_pointer(netlbl_domhsh_def, entry); | 401 | rcu_assign_pointer(netlbl_domhsh_def, entry); |
| 403 | } | 402 | } |
| 404 | 403 | ||
| 405 | if (entry->type == NETLBL_NLTYPE_ADDRSELECT) { | 404 | if (entry->def.type == NETLBL_NLTYPE_ADDRSELECT) { |
| 406 | netlbl_af4list_foreach_rcu(iter4, | 405 | netlbl_af4list_foreach_rcu(iter4, |
| 407 | &entry->type_def.addrsel->list4) | 406 | &entry->def.addrsel->list4) |
| 408 | netlbl_domhsh_audit_add(entry, iter4, NULL, | 407 | netlbl_domhsh_audit_add(entry, iter4, NULL, |
| 409 | ret_val, audit_info); | 408 | ret_val, audit_info); |
| 410 | #if IS_ENABLED(CONFIG_IPV6) | 409 | #if IS_ENABLED(CONFIG_IPV6) |
| 411 | netlbl_af6list_foreach_rcu(iter6, | 410 | netlbl_af6list_foreach_rcu(iter6, |
| 412 | &entry->type_def.addrsel->list6) | 411 | &entry->def.addrsel->list6) |
| 413 | netlbl_domhsh_audit_add(entry, NULL, iter6, | 412 | netlbl_domhsh_audit_add(entry, NULL, iter6, |
| 414 | ret_val, audit_info); | 413 | ret_val, audit_info); |
| 415 | #endif /* IPv6 */ | 414 | #endif /* IPv6 */ |
| 416 | } else | 415 | } else |
| 417 | netlbl_domhsh_audit_add(entry, NULL, NULL, | 416 | netlbl_domhsh_audit_add(entry, NULL, NULL, |
| 418 | ret_val, audit_info); | 417 | ret_val, audit_info); |
| 419 | } else if (entry_old->type == NETLBL_NLTYPE_ADDRSELECT && | 418 | } else if (entry_old->def.type == NETLBL_NLTYPE_ADDRSELECT && |
| 420 | entry->type == NETLBL_NLTYPE_ADDRSELECT) { | 419 | entry->def.type == NETLBL_NLTYPE_ADDRSELECT) { |
| 421 | struct list_head *old_list4; | 420 | struct list_head *old_list4; |
| 422 | struct list_head *old_list6; | 421 | struct list_head *old_list6; |
| 423 | 422 | ||
| 424 | old_list4 = &entry_old->type_def.addrsel->list4; | 423 | old_list4 = &entry_old->def.addrsel->list4; |
| 425 | old_list6 = &entry_old->type_def.addrsel->list6; | 424 | old_list6 = &entry_old->def.addrsel->list6; |
| 426 | 425 | ||
| 427 | /* we only allow the addition of address selectors if all of | 426 | /* we only allow the addition of address selectors if all of |
| 428 | * the selectors do not exist in the existing domain map */ | 427 | * the selectors do not exist in the existing domain map */ |
| 429 | netlbl_af4list_foreach_rcu(iter4, | 428 | netlbl_af4list_foreach_rcu(iter4, &entry->def.addrsel->list4) |
| 430 | &entry->type_def.addrsel->list4) | ||
| 431 | if (netlbl_af4list_search_exact(iter4->addr, | 429 | if (netlbl_af4list_search_exact(iter4->addr, |
| 432 | iter4->mask, | 430 | iter4->mask, |
| 433 | old_list4)) { | 431 | old_list4)) { |
| @@ -435,8 +433,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, | |||
| 435 | goto add_return; | 433 | goto add_return; |
| 436 | } | 434 | } |
| 437 | #if IS_ENABLED(CONFIG_IPV6) | 435 | #if IS_ENABLED(CONFIG_IPV6) |
| 438 | netlbl_af6list_foreach_rcu(iter6, | 436 | netlbl_af6list_foreach_rcu(iter6, &entry->def.addrsel->list6) |
| 439 | &entry->type_def.addrsel->list6) | ||
| 440 | if (netlbl_af6list_search_exact(&iter6->addr, | 437 | if (netlbl_af6list_search_exact(&iter6->addr, |
| 441 | &iter6->mask, | 438 | &iter6->mask, |
| 442 | old_list6)) { | 439 | old_list6)) { |
| @@ -446,7 +443,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, | |||
| 446 | #endif /* IPv6 */ | 443 | #endif /* IPv6 */ |
| 447 | 444 | ||
| 448 | netlbl_af4list_foreach_safe(iter4, tmp4, | 445 | netlbl_af4list_foreach_safe(iter4, tmp4, |
| 449 | &entry->type_def.addrsel->list4) { | 446 | &entry->def.addrsel->list4) { |
| 450 | netlbl_af4list_remove_entry(iter4); | 447 | netlbl_af4list_remove_entry(iter4); |
| 451 | iter4->valid = 1; | 448 | iter4->valid = 1; |
| 452 | ret_val = netlbl_af4list_add(iter4, old_list4); | 449 | ret_val = netlbl_af4list_add(iter4, old_list4); |
| @@ -457,7 +454,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, | |||
| 457 | } | 454 | } |
| 458 | #if IS_ENABLED(CONFIG_IPV6) | 455 | #if IS_ENABLED(CONFIG_IPV6) |
| 459 | netlbl_af6list_foreach_safe(iter6, tmp6, | 456 | netlbl_af6list_foreach_safe(iter6, tmp6, |
| 460 | &entry->type_def.addrsel->list6) { | 457 | &entry->def.addrsel->list6) { |
| 461 | netlbl_af6list_remove_entry(iter6); | 458 | netlbl_af6list_remove_entry(iter6); |
| 462 | iter6->valid = 1; | 459 | iter6->valid = 1; |
| 463 | ret_val = netlbl_af6list_add(iter6, old_list6); | 460 | ret_val = netlbl_af6list_add(iter6, old_list6); |
| @@ -538,18 +535,18 @@ int netlbl_domhsh_remove_entry(struct netlbl_dom_map *entry, | |||
| 538 | struct netlbl_af4list *iter4; | 535 | struct netlbl_af4list *iter4; |
| 539 | struct netlbl_domaddr4_map *map4; | 536 | struct netlbl_domaddr4_map *map4; |
| 540 | 537 | ||
| 541 | switch (entry->type) { | 538 | switch (entry->def.type) { |
| 542 | case NETLBL_NLTYPE_ADDRSELECT: | 539 | case NETLBL_NLTYPE_ADDRSELECT: |
| 543 | netlbl_af4list_foreach_rcu(iter4, | 540 | netlbl_af4list_foreach_rcu(iter4, |
| 544 | &entry->type_def.addrsel->list4) { | 541 | &entry->def.addrsel->list4) { |
| 545 | map4 = netlbl_domhsh_addr4_entry(iter4); | 542 | map4 = netlbl_domhsh_addr4_entry(iter4); |
| 546 | cipso_v4_doi_putdef(map4->type_def.cipsov4); | 543 | cipso_v4_doi_putdef(map4->def.cipso); |
| 547 | } | 544 | } |
| 548 | /* no need to check the IPv6 list since we currently | 545 | /* no need to check the IPv6 list since we currently |
| 549 | * support only unlabeled protocols for IPv6 */ | 546 | * support only unlabeled protocols for IPv6 */ |
| 550 | break; | 547 | break; |
| 551 | case NETLBL_NLTYPE_CIPSOV4: | 548 | case NETLBL_NLTYPE_CIPSOV4: |
| 552 | cipso_v4_doi_putdef(entry->type_def.cipsov4); | 549 | cipso_v4_doi_putdef(entry->def.cipso); |
| 553 | break; | 550 | break; |
| 554 | } | 551 | } |
| 555 | call_rcu(&entry->rcu, netlbl_domhsh_free_entry); | 552 | call_rcu(&entry->rcu, netlbl_domhsh_free_entry); |
| @@ -590,20 +587,21 @@ int netlbl_domhsh_remove_af4(const char *domain, | |||
| 590 | entry_map = netlbl_domhsh_search(domain); | 587 | entry_map = netlbl_domhsh_search(domain); |
| 591 | else | 588 | else |
| 592 | entry_map = netlbl_domhsh_search_def(domain); | 589 | entry_map = netlbl_domhsh_search_def(domain); |
| 593 | if (entry_map == NULL || entry_map->type != NETLBL_NLTYPE_ADDRSELECT) | 590 | if (entry_map == NULL || |
| 591 | entry_map->def.type != NETLBL_NLTYPE_ADDRSELECT) | ||
| 594 | goto remove_af4_failure; | 592 | goto remove_af4_failure; |
| 595 | 593 | ||
| 596 | spin_lock(&netlbl_domhsh_lock); | 594 | spin_lock(&netlbl_domhsh_lock); |
| 597 | entry_addr = netlbl_af4list_remove(addr->s_addr, mask->s_addr, | 595 | entry_addr = netlbl_af4list_remove(addr->s_addr, mask->s_addr, |
| 598 | &entry_map->type_def.addrsel->list4); | 596 | &entry_map->def.addrsel->list4); |
| 599 | spin_unlock(&netlbl_domhsh_lock); | 597 | spin_unlock(&netlbl_domhsh_lock); |
| 600 | 598 | ||
| 601 | if (entry_addr == NULL) | 599 | if (entry_addr == NULL) |
| 602 | goto remove_af4_failure; | 600 | goto remove_af4_failure; |
| 603 | netlbl_af4list_foreach_rcu(iter4, &entry_map->type_def.addrsel->list4) | 601 | netlbl_af4list_foreach_rcu(iter4, &entry_map->def.addrsel->list4) |
| 604 | goto remove_af4_single_addr; | 602 | goto remove_af4_single_addr; |
| 605 | #if IS_ENABLED(CONFIG_IPV6) | 603 | #if IS_ENABLED(CONFIG_IPV6) |
| 606 | netlbl_af6list_foreach_rcu(iter6, &entry_map->type_def.addrsel->list6) | 604 | netlbl_af6list_foreach_rcu(iter6, &entry_map->def.addrsel->list6) |
| 607 | goto remove_af4_single_addr; | 605 | goto remove_af4_single_addr; |
| 608 | #endif /* IPv6 */ | 606 | #endif /* IPv6 */ |
| 609 | /* the domain mapping is empty so remove it from the mapping table */ | 607 | /* the domain mapping is empty so remove it from the mapping table */ |
| @@ -616,7 +614,7 @@ remove_af4_single_addr: | |||
| 616 | * shouldn't be a problem */ | 614 | * shouldn't be a problem */ |
| 617 | synchronize_rcu(); | 615 | synchronize_rcu(); |
| 618 | entry = netlbl_domhsh_addr4_entry(entry_addr); | 616 | entry = netlbl_domhsh_addr4_entry(entry_addr); |
| 619 | cipso_v4_doi_putdef(entry->type_def.cipsov4); | 617 | cipso_v4_doi_putdef(entry->def.cipso); |
| 620 | kfree(entry); | 618 | kfree(entry); |
| 621 | return 0; | 619 | return 0; |
| 622 | 620 | ||
| @@ -693,8 +691,8 @@ struct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain) | |||
| 693 | * responsible for ensuring that rcu_read_[un]lock() is called. | 691 | * responsible for ensuring that rcu_read_[un]lock() is called. |
| 694 | * | 692 | * |
| 695 | */ | 693 | */ |
| 696 | struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain, | 694 | struct netlbl_dommap_def *netlbl_domhsh_getentry_af4(const char *domain, |
| 697 | __be32 addr) | 695 | __be32 addr) |
| 698 | { | 696 | { |
| 699 | struct netlbl_dom_map *dom_iter; | 697 | struct netlbl_dom_map *dom_iter; |
| 700 | struct netlbl_af4list *addr_iter; | 698 | struct netlbl_af4list *addr_iter; |
| @@ -702,15 +700,13 @@ struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain, | |||
| 702 | dom_iter = netlbl_domhsh_search_def(domain); | 700 | dom_iter = netlbl_domhsh_search_def(domain); |
| 703 | if (dom_iter == NULL) | 701 | if (dom_iter == NULL) |
| 704 | return NULL; | 702 | return NULL; |
| 705 | if (dom_iter->type != NETLBL_NLTYPE_ADDRSELECT) | ||
| 706 | return NULL; | ||
| 707 | 703 | ||
| 708 | addr_iter = netlbl_af4list_search(addr, | 704 | if (dom_iter->def.type != NETLBL_NLTYPE_ADDRSELECT) |
| 709 | &dom_iter->type_def.addrsel->list4); | 705 | return &dom_iter->def; |
| 706 | addr_iter = netlbl_af4list_search(addr, &dom_iter->def.addrsel->list4); | ||
| 710 | if (addr_iter == NULL) | 707 | if (addr_iter == NULL) |
| 711 | return NULL; | 708 | return NULL; |
| 712 | 709 | return &(netlbl_domhsh_addr4_entry(addr_iter)->def); | |
| 713 | return netlbl_domhsh_addr4_entry(addr_iter); | ||
| 714 | } | 710 | } |
| 715 | 711 | ||
| 716 | #if IS_ENABLED(CONFIG_IPV6) | 712 | #if IS_ENABLED(CONFIG_IPV6) |
| @@ -725,7 +721,7 @@ struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain, | |||
| 725 | * responsible for ensuring that rcu_read_[un]lock() is called. | 721 | * responsible for ensuring that rcu_read_[un]lock() is called. |
| 726 | * | 722 | * |
| 727 | */ | 723 | */ |
| 728 | struct netlbl_domaddr6_map *netlbl_domhsh_getentry_af6(const char *domain, | 724 | struct netlbl_dommap_def *netlbl_domhsh_getentry_af6(const char *domain, |
| 729 | const struct in6_addr *addr) | 725 | const struct in6_addr *addr) |
| 730 | { | 726 | { |
| 731 | struct netlbl_dom_map *dom_iter; | 727 | struct netlbl_dom_map *dom_iter; |
| @@ -734,15 +730,13 @@ struct netlbl_domaddr6_map *netlbl_domhsh_getentry_af6(const char *domain, | |||
| 734 | dom_iter = netlbl_domhsh_search_def(domain); | 730 | dom_iter = netlbl_domhsh_search_def(domain); |
| 735 | if (dom_iter == NULL) | 731 | if (dom_iter == NULL) |
| 736 | return NULL; | 732 | return NULL; |
| 737 | if (dom_iter->type != NETLBL_NLTYPE_ADDRSELECT) | ||
| 738 | return NULL; | ||
| 739 | 733 | ||
| 740 | addr_iter = netlbl_af6list_search(addr, | 734 | if (dom_iter->def.type != NETLBL_NLTYPE_ADDRSELECT) |
| 741 | &dom_iter->type_def.addrsel->list6); | 735 | return &dom_iter->def; |
| 736 | addr_iter = netlbl_af6list_search(addr, &dom_iter->def.addrsel->list6); | ||
| 742 | if (addr_iter == NULL) | 737 | if (addr_iter == NULL) |
| 743 | return NULL; | 738 | return NULL; |
| 744 | 739 | return &(netlbl_domhsh_addr6_entry(addr_iter)->def); | |
| 745 | return netlbl_domhsh_addr6_entry(addr_iter); | ||
| 746 | } | 740 | } |
| 747 | #endif /* IPv6 */ | 741 | #endif /* IPv6 */ |
| 748 | 742 | ||
diff --git a/net/netlabel/netlabel_domainhash.h b/net/netlabel/netlabel_domainhash.h index 90872c4ca30f..b9be0eed8980 100644 --- a/net/netlabel/netlabel_domainhash.h +++ b/net/netlabel/netlabel_domainhash.h | |||
| @@ -43,37 +43,35 @@ | |||
| 43 | #define NETLBL_DOMHSH_BITSIZE 7 | 43 | #define NETLBL_DOMHSH_BITSIZE 7 |
| 44 | 44 | ||
| 45 | /* Domain mapping definition structures */ | 45 | /* Domain mapping definition structures */ |
| 46 | struct netlbl_domaddr_map { | ||
| 47 | struct list_head list4; | ||
| 48 | struct list_head list6; | ||
| 49 | }; | ||
| 50 | struct netlbl_dommap_def { | ||
| 51 | u32 type; | ||
| 52 | union { | ||
| 53 | struct netlbl_domaddr_map *addrsel; | ||
| 54 | struct cipso_v4_doi *cipso; | ||
| 55 | }; | ||
| 56 | }; | ||
| 46 | #define netlbl_domhsh_addr4_entry(iter) \ | 57 | #define netlbl_domhsh_addr4_entry(iter) \ |
| 47 | container_of(iter, struct netlbl_domaddr4_map, list) | 58 | container_of(iter, struct netlbl_domaddr4_map, list) |
| 48 | struct netlbl_domaddr4_map { | 59 | struct netlbl_domaddr4_map { |
| 49 | u32 type; | 60 | struct netlbl_dommap_def def; |
| 50 | union { | ||
| 51 | struct cipso_v4_doi *cipsov4; | ||
| 52 | } type_def; | ||
| 53 | 61 | ||
| 54 | struct netlbl_af4list list; | 62 | struct netlbl_af4list list; |
| 55 | }; | 63 | }; |
| 56 | #define netlbl_domhsh_addr6_entry(iter) \ | 64 | #define netlbl_domhsh_addr6_entry(iter) \ |
| 57 | container_of(iter, struct netlbl_domaddr6_map, list) | 65 | container_of(iter, struct netlbl_domaddr6_map, list) |
| 58 | struct netlbl_domaddr6_map { | 66 | struct netlbl_domaddr6_map { |
| 59 | u32 type; | 67 | struct netlbl_dommap_def def; |
| 60 | |||
| 61 | /* NOTE: no 'type_def' union needed at present since we don't currently | ||
| 62 | * support any IPv6 labeling protocols */ | ||
| 63 | 68 | ||
| 64 | struct netlbl_af6list list; | 69 | struct netlbl_af6list list; |
| 65 | }; | 70 | }; |
| 66 | struct netlbl_domaddr_map { | 71 | |
| 67 | struct list_head list4; | ||
| 68 | struct list_head list6; | ||
| 69 | }; | ||
| 70 | struct netlbl_dom_map { | 72 | struct netlbl_dom_map { |
| 71 | char *domain; | 73 | char *domain; |
| 72 | u32 type; | 74 | struct netlbl_dommap_def def; |
| 73 | union { | ||
| 74 | struct cipso_v4_doi *cipsov4; | ||
| 75 | struct netlbl_domaddr_map *addrsel; | ||
| 76 | } type_def; | ||
| 77 | 75 | ||
| 78 | u32 valid; | 76 | u32 valid; |
| 79 | struct list_head list; | 77 | struct list_head list; |
| @@ -97,16 +95,16 @@ int netlbl_domhsh_remove_af4(const char *domain, | |||
| 97 | int netlbl_domhsh_remove(const char *domain, struct netlbl_audit *audit_info); | 95 | int netlbl_domhsh_remove(const char *domain, struct netlbl_audit *audit_info); |
| 98 | int netlbl_domhsh_remove_default(struct netlbl_audit *audit_info); | 96 | int netlbl_domhsh_remove_default(struct netlbl_audit *audit_info); |
| 99 | struct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain); | 97 | struct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain); |
| 100 | struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain, | 98 | struct netlbl_dommap_def *netlbl_domhsh_getentry_af4(const char *domain, |
| 101 | __be32 addr); | 99 | __be32 addr); |
| 100 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 101 | struct netlbl_dommap_def *netlbl_domhsh_getentry_af6(const char *domain, | ||
| 102 | const struct in6_addr *addr); | ||
| 103 | #endif /* IPv6 */ | ||
| 104 | |||
| 102 | int netlbl_domhsh_walk(u32 *skip_bkt, | 105 | int netlbl_domhsh_walk(u32 *skip_bkt, |
| 103 | u32 *skip_chain, | 106 | u32 *skip_chain, |
| 104 | int (*callback) (struct netlbl_dom_map *entry, void *arg), | 107 | int (*callback) (struct netlbl_dom_map *entry, void *arg), |
| 105 | void *cb_arg); | 108 | void *cb_arg); |
| 106 | 109 | ||
| 107 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 108 | struct netlbl_domaddr6_map *netlbl_domhsh_getentry_af6(const char *domain, | ||
| 109 | const struct in6_addr *addr); | ||
| 110 | #endif /* IPv6 */ | ||
| 111 | |||
| 112 | #endif | 110 | #endif |
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index 7c94aedd0912..96a458e12f60 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
| @@ -122,7 +122,7 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | if (addr == NULL && mask == NULL) | 124 | if (addr == NULL && mask == NULL) |
| 125 | entry->type = NETLBL_NLTYPE_UNLABELED; | 125 | entry->def.type = NETLBL_NLTYPE_UNLABELED; |
| 126 | else if (addr != NULL && mask != NULL) { | 126 | else if (addr != NULL && mask != NULL) { |
| 127 | addrmap = kzalloc(sizeof(*addrmap), GFP_ATOMIC); | 127 | addrmap = kzalloc(sizeof(*addrmap), GFP_ATOMIC); |
| 128 | if (addrmap == NULL) | 128 | if (addrmap == NULL) |
| @@ -137,7 +137,7 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 137 | map4 = kzalloc(sizeof(*map4), GFP_ATOMIC); | 137 | map4 = kzalloc(sizeof(*map4), GFP_ATOMIC); |
| 138 | if (map4 == NULL) | 138 | if (map4 == NULL) |
| 139 | goto cfg_unlbl_map_add_failure; | 139 | goto cfg_unlbl_map_add_failure; |
| 140 | map4->type = NETLBL_NLTYPE_UNLABELED; | 140 | map4->def.type = NETLBL_NLTYPE_UNLABELED; |
| 141 | map4->list.addr = addr4->s_addr & mask4->s_addr; | 141 | map4->list.addr = addr4->s_addr & mask4->s_addr; |
| 142 | map4->list.mask = mask4->s_addr; | 142 | map4->list.mask = mask4->s_addr; |
| 143 | map4->list.valid = 1; | 143 | map4->list.valid = 1; |
| @@ -154,7 +154,7 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 154 | map6 = kzalloc(sizeof(*map6), GFP_ATOMIC); | 154 | map6 = kzalloc(sizeof(*map6), GFP_ATOMIC); |
| 155 | if (map6 == NULL) | 155 | if (map6 == NULL) |
| 156 | goto cfg_unlbl_map_add_failure; | 156 | goto cfg_unlbl_map_add_failure; |
| 157 | map6->type = NETLBL_NLTYPE_UNLABELED; | 157 | map6->def.type = NETLBL_NLTYPE_UNLABELED; |
| 158 | map6->list.addr = *addr6; | 158 | map6->list.addr = *addr6; |
| 159 | map6->list.addr.s6_addr32[0] &= mask6->s6_addr32[0]; | 159 | map6->list.addr.s6_addr32[0] &= mask6->s6_addr32[0]; |
| 160 | map6->list.addr.s6_addr32[1] &= mask6->s6_addr32[1]; | 160 | map6->list.addr.s6_addr32[1] &= mask6->s6_addr32[1]; |
| @@ -174,8 +174,8 @@ int netlbl_cfg_unlbl_map_add(const char *domain, | |||
| 174 | break; | 174 | break; |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | entry->type_def.addrsel = addrmap; | 177 | entry->def.addrsel = addrmap; |
| 178 | entry->type = NETLBL_NLTYPE_ADDRSELECT; | 178 | entry->def.type = NETLBL_NLTYPE_ADDRSELECT; |
| 179 | } else { | 179 | } else { |
| 180 | ret_val = -EINVAL; | 180 | ret_val = -EINVAL; |
| 181 | goto cfg_unlbl_map_add_failure; | 181 | goto cfg_unlbl_map_add_failure; |
| @@ -355,8 +355,8 @@ int netlbl_cfg_cipsov4_map_add(u32 doi, | |||
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | if (addr == NULL && mask == NULL) { | 357 | if (addr == NULL && mask == NULL) { |
| 358 | entry->type_def.cipsov4 = doi_def; | 358 | entry->def.cipso = doi_def; |
| 359 | entry->type = NETLBL_NLTYPE_CIPSOV4; | 359 | entry->def.type = NETLBL_NLTYPE_CIPSOV4; |
| 360 | } else if (addr != NULL && mask != NULL) { | 360 | } else if (addr != NULL && mask != NULL) { |
| 361 | addrmap = kzalloc(sizeof(*addrmap), GFP_ATOMIC); | 361 | addrmap = kzalloc(sizeof(*addrmap), GFP_ATOMIC); |
| 362 | if (addrmap == NULL) | 362 | if (addrmap == NULL) |
| @@ -367,8 +367,8 @@ int netlbl_cfg_cipsov4_map_add(u32 doi, | |||
| 367 | addrinfo = kzalloc(sizeof(*addrinfo), GFP_ATOMIC); | 367 | addrinfo = kzalloc(sizeof(*addrinfo), GFP_ATOMIC); |
| 368 | if (addrinfo == NULL) | 368 | if (addrinfo == NULL) |
| 369 | goto out_addrinfo; | 369 | goto out_addrinfo; |
| 370 | addrinfo->type_def.cipsov4 = doi_def; | 370 | addrinfo->def.cipso = doi_def; |
| 371 | addrinfo->type = NETLBL_NLTYPE_CIPSOV4; | 371 | addrinfo->def.type = NETLBL_NLTYPE_CIPSOV4; |
| 372 | addrinfo->list.addr = addr->s_addr & mask->s_addr; | 372 | addrinfo->list.addr = addr->s_addr & mask->s_addr; |
| 373 | addrinfo->list.mask = mask->s_addr; | 373 | addrinfo->list.mask = mask->s_addr; |
| 374 | addrinfo->list.valid = 1; | 374 | addrinfo->list.valid = 1; |
| @@ -376,8 +376,8 @@ int netlbl_cfg_cipsov4_map_add(u32 doi, | |||
| 376 | if (ret_val != 0) | 376 | if (ret_val != 0) |
| 377 | goto cfg_cipsov4_map_add_failure; | 377 | goto cfg_cipsov4_map_add_failure; |
| 378 | 378 | ||
| 379 | entry->type_def.addrsel = addrmap; | 379 | entry->def.addrsel = addrmap; |
| 380 | entry->type = NETLBL_NLTYPE_ADDRSELECT; | 380 | entry->def.type = NETLBL_NLTYPE_ADDRSELECT; |
| 381 | } else { | 381 | } else { |
| 382 | ret_val = -EINVAL; | 382 | ret_val = -EINVAL; |
| 383 | goto out_addrmap; | 383 | goto out_addrmap; |
| @@ -657,14 +657,14 @@ int netlbl_sock_setattr(struct sock *sk, | |||
| 657 | } | 657 | } |
| 658 | switch (family) { | 658 | switch (family) { |
| 659 | case AF_INET: | 659 | case AF_INET: |
| 660 | switch (dom_entry->type) { | 660 | switch (dom_entry->def.type) { |
| 661 | case NETLBL_NLTYPE_ADDRSELECT: | 661 | case NETLBL_NLTYPE_ADDRSELECT: |
| 662 | ret_val = -EDESTADDRREQ; | 662 | ret_val = -EDESTADDRREQ; |
| 663 | break; | 663 | break; |
| 664 | case NETLBL_NLTYPE_CIPSOV4: | 664 | case NETLBL_NLTYPE_CIPSOV4: |
| 665 | ret_val = cipso_v4_sock_setattr(sk, | 665 | ret_val = cipso_v4_sock_setattr(sk, |
| 666 | dom_entry->type_def.cipsov4, | 666 | dom_entry->def.cipso, |
| 667 | secattr); | 667 | secattr); |
| 668 | break; | 668 | break; |
| 669 | case NETLBL_NLTYPE_UNLABELED: | 669 | case NETLBL_NLTYPE_UNLABELED: |
| 670 | ret_val = 0; | 670 | ret_val = 0; |
| @@ -754,23 +754,22 @@ int netlbl_conn_setattr(struct sock *sk, | |||
| 754 | { | 754 | { |
| 755 | int ret_val; | 755 | int ret_val; |
| 756 | struct sockaddr_in *addr4; | 756 | struct sockaddr_in *addr4; |
| 757 | struct netlbl_domaddr4_map *af4_entry; | 757 | struct netlbl_dommap_def *entry; |
| 758 | 758 | ||
| 759 | rcu_read_lock(); | 759 | rcu_read_lock(); |
| 760 | switch (addr->sa_family) { | 760 | switch (addr->sa_family) { |
| 761 | case AF_INET: | 761 | case AF_INET: |
| 762 | addr4 = (struct sockaddr_in *)addr; | 762 | addr4 = (struct sockaddr_in *)addr; |
| 763 | af4_entry = netlbl_domhsh_getentry_af4(secattr->domain, | 763 | entry = netlbl_domhsh_getentry_af4(secattr->domain, |
| 764 | addr4->sin_addr.s_addr); | 764 | addr4->sin_addr.s_addr); |
| 765 | if (af4_entry == NULL) { | 765 | if (entry == NULL) { |
| 766 | ret_val = -ENOENT; | 766 | ret_val = -ENOENT; |
| 767 | goto conn_setattr_return; | 767 | goto conn_setattr_return; |
| 768 | } | 768 | } |
| 769 | switch (af4_entry->type) { | 769 | switch (entry->type) { |
| 770 | case NETLBL_NLTYPE_CIPSOV4: | 770 | case NETLBL_NLTYPE_CIPSOV4: |
| 771 | ret_val = cipso_v4_sock_setattr(sk, | 771 | ret_val = cipso_v4_sock_setattr(sk, |
| 772 | af4_entry->type_def.cipsov4, | 772 | entry->cipso, secattr); |
| 773 | secattr); | ||
| 774 | break; | 773 | break; |
| 775 | case NETLBL_NLTYPE_UNLABELED: | 774 | case NETLBL_NLTYPE_UNLABELED: |
| 776 | /* just delete the protocols we support for right now | 775 | /* just delete the protocols we support for right now |
| @@ -812,36 +811,21 @@ int netlbl_req_setattr(struct request_sock *req, | |||
| 812 | const struct netlbl_lsm_secattr *secattr) | 811 | const struct netlbl_lsm_secattr *secattr) |
| 813 | { | 812 | { |
| 814 | int ret_val; | 813 | int ret_val; |
| 815 | struct netlbl_dom_map *dom_entry; | 814 | struct netlbl_dommap_def *entry; |
| 816 | struct netlbl_domaddr4_map *af4_entry; | ||
| 817 | u32 proto_type; | ||
| 818 | struct cipso_v4_doi *proto_cv4; | ||
| 819 | 815 | ||
| 820 | rcu_read_lock(); | 816 | rcu_read_lock(); |
| 821 | dom_entry = netlbl_domhsh_getentry(secattr->domain); | ||
| 822 | if (dom_entry == NULL) { | ||
| 823 | ret_val = -ENOENT; | ||
| 824 | goto req_setattr_return; | ||
| 825 | } | ||
| 826 | switch (req->rsk_ops->family) { | 817 | switch (req->rsk_ops->family) { |
| 827 | case AF_INET: | 818 | case AF_INET: |
| 828 | if (dom_entry->type == NETLBL_NLTYPE_ADDRSELECT) { | 819 | entry = netlbl_domhsh_getentry_af4(secattr->domain, |
| 829 | struct inet_request_sock *req_inet = inet_rsk(req); | 820 | inet_rsk(req)->rmt_addr); |
| 830 | af4_entry = netlbl_domhsh_getentry_af4(secattr->domain, | 821 | if (entry == NULL) { |
| 831 | req_inet->rmt_addr); | 822 | ret_val = -ENOENT; |
| 832 | if (af4_entry == NULL) { | 823 | goto req_setattr_return; |
| 833 | ret_val = -ENOENT; | ||
| 834 | goto req_setattr_return; | ||
| 835 | } | ||
| 836 | proto_type = af4_entry->type; | ||
| 837 | proto_cv4 = af4_entry->type_def.cipsov4; | ||
| 838 | } else { | ||
| 839 | proto_type = dom_entry->type; | ||
| 840 | proto_cv4 = dom_entry->type_def.cipsov4; | ||
| 841 | } | 824 | } |
| 842 | switch (proto_type) { | 825 | switch (entry->type) { |
| 843 | case NETLBL_NLTYPE_CIPSOV4: | 826 | case NETLBL_NLTYPE_CIPSOV4: |
| 844 | ret_val = cipso_v4_req_setattr(req, proto_cv4, secattr); | 827 | ret_val = cipso_v4_req_setattr(req, |
| 828 | entry->cipso, secattr); | ||
| 845 | break; | 829 | break; |
| 846 | case NETLBL_NLTYPE_UNLABELED: | 830 | case NETLBL_NLTYPE_UNLABELED: |
| 847 | /* just delete the protocols we support for right now | 831 | /* just delete the protocols we support for right now |
| @@ -899,23 +883,21 @@ int netlbl_skbuff_setattr(struct sk_buff *skb, | |||
| 899 | { | 883 | { |
| 900 | int ret_val; | 884 | int ret_val; |
| 901 | struct iphdr *hdr4; | 885 | struct iphdr *hdr4; |
| 902 | struct netlbl_domaddr4_map *af4_entry; | 886 | struct netlbl_dommap_def *entry; |
| 903 | 887 | ||
| 904 | rcu_read_lock(); | 888 | rcu_read_lock(); |
| 905 | switch (family) { | 889 | switch (family) { |
| 906 | case AF_INET: | 890 | case AF_INET: |
| 907 | hdr4 = ip_hdr(skb); | 891 | hdr4 = ip_hdr(skb); |
| 908 | af4_entry = netlbl_domhsh_getentry_af4(secattr->domain, | 892 | entry = netlbl_domhsh_getentry_af4(secattr->domain,hdr4->daddr); |
| 909 | hdr4->daddr); | 893 | if (entry == NULL) { |
| 910 | if (af4_entry == NULL) { | ||
| 911 | ret_val = -ENOENT; | 894 | ret_val = -ENOENT; |
| 912 | goto skbuff_setattr_return; | 895 | goto skbuff_setattr_return; |
| 913 | } | 896 | } |
| 914 | switch (af4_entry->type) { | 897 | switch (entry->type) { |
| 915 | case NETLBL_NLTYPE_CIPSOV4: | 898 | case NETLBL_NLTYPE_CIPSOV4: |
| 916 | ret_val = cipso_v4_skbuff_setattr(skb, | 899 | ret_val = cipso_v4_skbuff_setattr(skb, entry->cipso, |
| 917 | af4_entry->type_def.cipsov4, | 900 | secattr); |
| 918 | secattr); | ||
| 919 | break; | 901 | break; |
| 920 | case NETLBL_NLTYPE_UNLABELED: | 902 | case NETLBL_NLTYPE_UNLABELED: |
| 921 | /* just delete the protocols we support for right now | 903 | /* just delete the protocols we support for right now |
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c index c5384ffc6146..dd1c37d7acbc 100644 --- a/net/netlabel/netlabel_mgmt.c +++ b/net/netlabel/netlabel_mgmt.c | |||
| @@ -104,7 +104,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 104 | ret_val = -ENOMEM; | 104 | ret_val = -ENOMEM; |
| 105 | goto add_failure; | 105 | goto add_failure; |
| 106 | } | 106 | } |
| 107 | entry->type = nla_get_u32(info->attrs[NLBL_MGMT_A_PROTOCOL]); | 107 | entry->def.type = nla_get_u32(info->attrs[NLBL_MGMT_A_PROTOCOL]); |
| 108 | if (info->attrs[NLBL_MGMT_A_DOMAIN]) { | 108 | if (info->attrs[NLBL_MGMT_A_DOMAIN]) { |
| 109 | size_t tmp_size = nla_len(info->attrs[NLBL_MGMT_A_DOMAIN]); | 109 | size_t tmp_size = nla_len(info->attrs[NLBL_MGMT_A_DOMAIN]); |
| 110 | entry->domain = kmalloc(tmp_size, GFP_KERNEL); | 110 | entry->domain = kmalloc(tmp_size, GFP_KERNEL); |
| @@ -116,12 +116,12 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 116 | info->attrs[NLBL_MGMT_A_DOMAIN], tmp_size); | 116 | info->attrs[NLBL_MGMT_A_DOMAIN], tmp_size); |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | /* NOTE: internally we allow/use a entry->type value of | 119 | /* NOTE: internally we allow/use a entry->def.type value of |
| 120 | * NETLBL_NLTYPE_ADDRSELECT but we don't currently allow users | 120 | * NETLBL_NLTYPE_ADDRSELECT but we don't currently allow users |
| 121 | * to pass that as a protocol value because we need to know the | 121 | * to pass that as a protocol value because we need to know the |
| 122 | * "real" protocol */ | 122 | * "real" protocol */ |
| 123 | 123 | ||
| 124 | switch (entry->type) { | 124 | switch (entry->def.type) { |
| 125 | case NETLBL_NLTYPE_UNLABELED: | 125 | case NETLBL_NLTYPE_UNLABELED: |
| 126 | break; | 126 | break; |
| 127 | case NETLBL_NLTYPE_CIPSOV4: | 127 | case NETLBL_NLTYPE_CIPSOV4: |
| @@ -132,7 +132,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 132 | cipsov4 = cipso_v4_doi_getdef(tmp_val); | 132 | cipsov4 = cipso_v4_doi_getdef(tmp_val); |
| 133 | if (cipsov4 == NULL) | 133 | if (cipsov4 == NULL) |
| 134 | goto add_failure; | 134 | goto add_failure; |
| 135 | entry->type_def.cipsov4 = cipsov4; | 135 | entry->def.cipso = cipsov4; |
| 136 | break; | 136 | break; |
| 137 | default: | 137 | default: |
| 138 | goto add_failure; | 138 | goto add_failure; |
| @@ -172,9 +172,9 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 172 | map->list.addr = addr->s_addr & mask->s_addr; | 172 | map->list.addr = addr->s_addr & mask->s_addr; |
| 173 | map->list.mask = mask->s_addr; | 173 | map->list.mask = mask->s_addr; |
| 174 | map->list.valid = 1; | 174 | map->list.valid = 1; |
| 175 | map->type = entry->type; | 175 | map->def.type = entry->def.type; |
| 176 | if (cipsov4) | 176 | if (cipsov4) |
| 177 | map->type_def.cipsov4 = cipsov4; | 177 | map->def.cipso = cipsov4; |
| 178 | 178 | ||
| 179 | ret_val = netlbl_af4list_add(&map->list, &addrmap->list4); | 179 | ret_val = netlbl_af4list_add(&map->list, &addrmap->list4); |
| 180 | if (ret_val != 0) { | 180 | if (ret_val != 0) { |
| @@ -182,8 +182,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 182 | goto add_failure; | 182 | goto add_failure; |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | entry->type = NETLBL_NLTYPE_ADDRSELECT; | 185 | entry->def.type = NETLBL_NLTYPE_ADDRSELECT; |
| 186 | entry->type_def.addrsel = addrmap; | 186 | entry->def.addrsel = addrmap; |
| 187 | #if IS_ENABLED(CONFIG_IPV6) | 187 | #if IS_ENABLED(CONFIG_IPV6) |
| 188 | } else if (info->attrs[NLBL_MGMT_A_IPV6ADDR]) { | 188 | } else if (info->attrs[NLBL_MGMT_A_IPV6ADDR]) { |
| 189 | struct in6_addr *addr; | 189 | struct in6_addr *addr; |
| @@ -223,7 +223,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 223 | map->list.addr.s6_addr32[3] &= mask->s6_addr32[3]; | 223 | map->list.addr.s6_addr32[3] &= mask->s6_addr32[3]; |
| 224 | map->list.mask = *mask; | 224 | map->list.mask = *mask; |
| 225 | map->list.valid = 1; | 225 | map->list.valid = 1; |
| 226 | map->type = entry->type; | 226 | map->def.type = entry->def.type; |
| 227 | 227 | ||
| 228 | ret_val = netlbl_af6list_add(&map->list, &addrmap->list6); | 228 | ret_val = netlbl_af6list_add(&map->list, &addrmap->list6); |
| 229 | if (ret_val != 0) { | 229 | if (ret_val != 0) { |
| @@ -231,8 +231,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info, | |||
| 231 | goto add_failure; | 231 | goto add_failure; |
| 232 | } | 232 | } |
| 233 | 233 | ||
| 234 | entry->type = NETLBL_NLTYPE_ADDRSELECT; | 234 | entry->def.type = NETLBL_NLTYPE_ADDRSELECT; |
| 235 | entry->type_def.addrsel = addrmap; | 235 | entry->def.addrsel = addrmap; |
| 236 | #endif /* IPv6 */ | 236 | #endif /* IPv6 */ |
| 237 | } | 237 | } |
| 238 | 238 | ||
| @@ -281,14 +281,13 @@ static int netlbl_mgmt_listentry(struct sk_buff *skb, | |||
| 281 | return ret_val; | 281 | return ret_val; |
| 282 | } | 282 | } |
| 283 | 283 | ||
| 284 | switch (entry->type) { | 284 | switch (entry->def.type) { |
| 285 | case NETLBL_NLTYPE_ADDRSELECT: | 285 | case NETLBL_NLTYPE_ADDRSELECT: |
| 286 | nla_a = nla_nest_start(skb, NLBL_MGMT_A_SELECTORLIST); | 286 | nla_a = nla_nest_start(skb, NLBL_MGMT_A_SELECTORLIST); |
| 287 | if (nla_a == NULL) | 287 | if (nla_a == NULL) |
| 288 | return -ENOMEM; | 288 | return -ENOMEM; |
| 289 | 289 | ||
| 290 | netlbl_af4list_foreach_rcu(iter4, | 290 | netlbl_af4list_foreach_rcu(iter4, &entry->def.addrsel->list4) { |
| 291 | &entry->type_def.addrsel->list4) { | ||
| 292 | struct netlbl_domaddr4_map *map4; | 291 | struct netlbl_domaddr4_map *map4; |
| 293 | struct in_addr addr_struct; | 292 | struct in_addr addr_struct; |
| 294 | 293 | ||
| @@ -310,13 +309,13 @@ static int netlbl_mgmt_listentry(struct sk_buff *skb, | |||
| 310 | return ret_val; | 309 | return ret_val; |
| 311 | map4 = netlbl_domhsh_addr4_entry(iter4); | 310 | map4 = netlbl_domhsh_addr4_entry(iter4); |
| 312 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, | 311 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, |
| 313 | map4->type); | 312 | map4->def.type); |
| 314 | if (ret_val != 0) | 313 | if (ret_val != 0) |
| 315 | return ret_val; | 314 | return ret_val; |
| 316 | switch (map4->type) { | 315 | switch (map4->def.type) { |
| 317 | case NETLBL_NLTYPE_CIPSOV4: | 316 | case NETLBL_NLTYPE_CIPSOV4: |
| 318 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_CV4DOI, | 317 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_CV4DOI, |
| 319 | map4->type_def.cipsov4->doi); | 318 | map4->def.cipso->doi); |
| 320 | if (ret_val != 0) | 319 | if (ret_val != 0) |
| 321 | return ret_val; | 320 | return ret_val; |
| 322 | break; | 321 | break; |
| @@ -325,8 +324,7 @@ static int netlbl_mgmt_listentry(struct sk_buff *skb, | |||
| 325 | nla_nest_end(skb, nla_b); | 324 | nla_nest_end(skb, nla_b); |
| 326 | } | 325 | } |
| 327 | #if IS_ENABLED(CONFIG_IPV6) | 326 | #if IS_ENABLED(CONFIG_IPV6) |
| 328 | netlbl_af6list_foreach_rcu(iter6, | 327 | netlbl_af6list_foreach_rcu(iter6, &entry->def.addrsel->list6) { |
| 329 | &entry->type_def.addrsel->list6) { | ||
| 330 | struct netlbl_domaddr6_map *map6; | 328 | struct netlbl_domaddr6_map *map6; |
| 331 | 329 | ||
| 332 | nla_b = nla_nest_start(skb, NLBL_MGMT_A_ADDRSELECTOR); | 330 | nla_b = nla_nest_start(skb, NLBL_MGMT_A_ADDRSELECTOR); |
| @@ -345,7 +343,7 @@ static int netlbl_mgmt_listentry(struct sk_buff *skb, | |||
| 345 | return ret_val; | 343 | return ret_val; |
| 346 | map6 = netlbl_domhsh_addr6_entry(iter6); | 344 | map6 = netlbl_domhsh_addr6_entry(iter6); |
| 347 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, | 345 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, |
| 348 | map6->type); | 346 | map6->def.type); |
| 349 | if (ret_val != 0) | 347 | if (ret_val != 0) |
| 350 | return ret_val; | 348 | return ret_val; |
| 351 | 349 | ||
| @@ -356,14 +354,14 @@ static int netlbl_mgmt_listentry(struct sk_buff *skb, | |||
| 356 | nla_nest_end(skb, nla_a); | 354 | nla_nest_end(skb, nla_a); |
| 357 | break; | 355 | break; |
| 358 | case NETLBL_NLTYPE_UNLABELED: | 356 | case NETLBL_NLTYPE_UNLABELED: |
| 359 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, entry->type); | 357 | ret_val = nla_put_u32(skb,NLBL_MGMT_A_PROTOCOL,entry->def.type); |
| 360 | break; | 358 | break; |
| 361 | case NETLBL_NLTYPE_CIPSOV4: | 359 | case NETLBL_NLTYPE_CIPSOV4: |
| 362 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_PROTOCOL, entry->type); | 360 | ret_val = nla_put_u32(skb,NLBL_MGMT_A_PROTOCOL,entry->def.type); |
| 363 | if (ret_val != 0) | 361 | if (ret_val != 0) |
| 364 | return ret_val; | 362 | return ret_val; |
| 365 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_CV4DOI, | 363 | ret_val = nla_put_u32(skb, NLBL_MGMT_A_CV4DOI, |
| 366 | entry->type_def.cipsov4->doi); | 364 | entry->def.cipso->doi); |
| 367 | break; | 365 | break; |
| 368 | } | 366 | } |
| 369 | 367 | ||
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index af3531926ee0..8f0897407a2c 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
| @@ -1541,7 +1541,7 @@ int __init netlbl_unlabel_defconf(void) | |||
| 1541 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); | 1541 | entry = kzalloc(sizeof(*entry), GFP_KERNEL); |
| 1542 | if (entry == NULL) | 1542 | if (entry == NULL) |
| 1543 | return -ENOMEM; | 1543 | return -ENOMEM; |
| 1544 | entry->type = NETLBL_NLTYPE_UNLABELED; | 1544 | entry->def.type = NETLBL_NLTYPE_UNLABELED; |
| 1545 | ret_val = netlbl_domhsh_add_default(entry, &audit_info); | 1545 | ret_val = netlbl_domhsh_add_default(entry, &audit_info); |
| 1546 | if (ret_val != 0) | 1546 | if (ret_val != 0) |
| 1547 | return ret_val; | 1547 | return ret_val; |
diff --git a/net/nfc/core.c b/net/nfc/core.c index dc96a83aa6ab..1d074dd1650f 100644 --- a/net/nfc/core.c +++ b/net/nfc/core.c | |||
| @@ -44,7 +44,7 @@ DEFINE_MUTEX(nfc_devlist_mutex); | |||
| 44 | /* NFC device ID bitmap */ | 44 | /* NFC device ID bitmap */ |
| 45 | static DEFINE_IDA(nfc_index_ida); | 45 | static DEFINE_IDA(nfc_index_ida); |
| 46 | 46 | ||
| 47 | int nfc_fw_upload(struct nfc_dev *dev, const char *firmware_name) | 47 | int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name) |
| 48 | { | 48 | { |
| 49 | int rc = 0; | 49 | int rc = 0; |
| 50 | 50 | ||
| @@ -62,28 +62,28 @@ int nfc_fw_upload(struct nfc_dev *dev, const char *firmware_name) | |||
| 62 | goto error; | 62 | goto error; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | if (!dev->ops->fw_upload) { | 65 | if (!dev->ops->fw_download) { |
| 66 | rc = -EOPNOTSUPP; | 66 | rc = -EOPNOTSUPP; |
| 67 | goto error; | 67 | goto error; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | dev->fw_upload_in_progress = true; | 70 | dev->fw_download_in_progress = true; |
| 71 | rc = dev->ops->fw_upload(dev, firmware_name); | 71 | rc = dev->ops->fw_download(dev, firmware_name); |
| 72 | if (rc) | 72 | if (rc) |
| 73 | dev->fw_upload_in_progress = false; | 73 | dev->fw_download_in_progress = false; |
| 74 | 74 | ||
| 75 | error: | 75 | error: |
| 76 | device_unlock(&dev->dev); | 76 | device_unlock(&dev->dev); |
| 77 | return rc; | 77 | return rc; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | int nfc_fw_upload_done(struct nfc_dev *dev, const char *firmware_name) | 80 | int nfc_fw_download_done(struct nfc_dev *dev, const char *firmware_name) |
| 81 | { | 81 | { |
| 82 | dev->fw_upload_in_progress = false; | 82 | dev->fw_download_in_progress = false; |
| 83 | 83 | ||
| 84 | return nfc_genl_fw_upload_done(dev, firmware_name); | 84 | return nfc_genl_fw_download_done(dev, firmware_name); |
| 85 | } | 85 | } |
| 86 | EXPORT_SYMBOL(nfc_fw_upload_done); | 86 | EXPORT_SYMBOL(nfc_fw_download_done); |
| 87 | 87 | ||
| 88 | /** | 88 | /** |
| 89 | * nfc_dev_up - turn on the NFC device | 89 | * nfc_dev_up - turn on the NFC device |
| @@ -110,7 +110,7 @@ int nfc_dev_up(struct nfc_dev *dev) | |||
| 110 | goto error; | 110 | goto error; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | if (dev->fw_upload_in_progress) { | 113 | if (dev->fw_download_in_progress) { |
| 114 | rc = -EBUSY; | 114 | rc = -EBUSY; |
| 115 | goto error; | 115 | goto error; |
| 116 | } | 116 | } |
diff --git a/net/nfc/hci/core.c b/net/nfc/hci/core.c index 7b1c186736eb..fe66908401f5 100644 --- a/net/nfc/hci/core.c +++ b/net/nfc/hci/core.c | |||
| @@ -809,14 +809,14 @@ static void nfc_hci_recv_from_llc(struct nfc_hci_dev *hdev, struct sk_buff *skb) | |||
| 809 | } | 809 | } |
| 810 | } | 810 | } |
| 811 | 811 | ||
| 812 | static int hci_fw_upload(struct nfc_dev *nfc_dev, const char *firmware_name) | 812 | static int hci_fw_download(struct nfc_dev *nfc_dev, const char *firmware_name) |
| 813 | { | 813 | { |
| 814 | struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); | 814 | struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); |
| 815 | 815 | ||
| 816 | if (!hdev->ops->fw_upload) | 816 | if (!hdev->ops->fw_download) |
| 817 | return -ENOTSUPP; | 817 | return -ENOTSUPP; |
| 818 | 818 | ||
| 819 | return hdev->ops->fw_upload(hdev, firmware_name); | 819 | return hdev->ops->fw_download(hdev, firmware_name); |
| 820 | } | 820 | } |
| 821 | 821 | ||
| 822 | static struct nfc_ops hci_nfc_ops = { | 822 | static struct nfc_ops hci_nfc_ops = { |
| @@ -831,7 +831,7 @@ static struct nfc_ops hci_nfc_ops = { | |||
| 831 | .im_transceive = hci_transceive, | 831 | .im_transceive = hci_transceive, |
| 832 | .tm_send = hci_tm_send, | 832 | .tm_send = hci_tm_send, |
| 833 | .check_presence = hci_check_presence, | 833 | .check_presence = hci_check_presence, |
| 834 | .fw_upload = hci_fw_upload, | 834 | .fw_download = hci_fw_download, |
| 835 | .discover_se = hci_discover_se, | 835 | .discover_se = hci_discover_se, |
| 836 | .enable_se = hci_enable_se, | 836 | .enable_se = hci_enable_se, |
| 837 | .disable_se = hci_disable_se, | 837 | .disable_se = hci_disable_se, |
diff --git a/net/nfc/nci/Kconfig b/net/nfc/nci/Kconfig index 2a2416080b4f..a4f1e42e3481 100644 --- a/net/nfc/nci/Kconfig +++ b/net/nfc/nci/Kconfig | |||
| @@ -11,6 +11,7 @@ config NFC_NCI | |||
| 11 | 11 | ||
| 12 | config NFC_NCI_SPI | 12 | config NFC_NCI_SPI |
| 13 | depends on NFC_NCI && SPI | 13 | depends on NFC_NCI && SPI |
| 14 | select CRC_CCITT | ||
| 14 | bool "NCI over SPI protocol support" | 15 | bool "NCI over SPI protocol support" |
| 15 | default n | 16 | default n |
| 16 | help | 17 | help |
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c index b05ad909778f..f16fd59d4160 100644 --- a/net/nfc/netlink.c +++ b/net/nfc/netlink.c | |||
| @@ -1089,7 +1089,7 @@ exit: | |||
| 1089 | return rc; | 1089 | return rc; |
| 1090 | } | 1090 | } |
| 1091 | 1091 | ||
| 1092 | static int nfc_genl_fw_upload(struct sk_buff *skb, struct genl_info *info) | 1092 | static int nfc_genl_fw_download(struct sk_buff *skb, struct genl_info *info) |
| 1093 | { | 1093 | { |
| 1094 | struct nfc_dev *dev; | 1094 | struct nfc_dev *dev; |
| 1095 | int rc; | 1095 | int rc; |
| @@ -1108,13 +1108,13 @@ static int nfc_genl_fw_upload(struct sk_buff *skb, struct genl_info *info) | |||
| 1108 | nla_strlcpy(firmware_name, info->attrs[NFC_ATTR_FIRMWARE_NAME], | 1108 | nla_strlcpy(firmware_name, info->attrs[NFC_ATTR_FIRMWARE_NAME], |
| 1109 | sizeof(firmware_name)); | 1109 | sizeof(firmware_name)); |
| 1110 | 1110 | ||
| 1111 | rc = nfc_fw_upload(dev, firmware_name); | 1111 | rc = nfc_fw_download(dev, firmware_name); |
| 1112 | 1112 | ||
| 1113 | nfc_put_device(dev); | 1113 | nfc_put_device(dev); |
| 1114 | return rc; | 1114 | return rc; |
| 1115 | } | 1115 | } |
| 1116 | 1116 | ||
| 1117 | int nfc_genl_fw_upload_done(struct nfc_dev *dev, const char *firmware_name) | 1117 | int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name) |
| 1118 | { | 1118 | { |
| 1119 | struct sk_buff *msg; | 1119 | struct sk_buff *msg; |
| 1120 | void *hdr; | 1120 | void *hdr; |
| @@ -1124,7 +1124,7 @@ int nfc_genl_fw_upload_done(struct nfc_dev *dev, const char *firmware_name) | |||
| 1124 | return -ENOMEM; | 1124 | return -ENOMEM; |
| 1125 | 1125 | ||
| 1126 | hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0, | 1126 | hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0, |
| 1127 | NFC_CMD_FW_UPLOAD); | 1127 | NFC_CMD_FW_DOWNLOAD); |
| 1128 | if (!hdr) | 1128 | if (!hdr) |
| 1129 | goto free_msg; | 1129 | goto free_msg; |
| 1130 | 1130 | ||
| @@ -1251,8 +1251,8 @@ static struct genl_ops nfc_genl_ops[] = { | |||
| 1251 | .policy = nfc_genl_policy, | 1251 | .policy = nfc_genl_policy, |
| 1252 | }, | 1252 | }, |
| 1253 | { | 1253 | { |
| 1254 | .cmd = NFC_CMD_FW_UPLOAD, | 1254 | .cmd = NFC_CMD_FW_DOWNLOAD, |
| 1255 | .doit = nfc_genl_fw_upload, | 1255 | .doit = nfc_genl_fw_download, |
| 1256 | .policy = nfc_genl_policy, | 1256 | .policy = nfc_genl_policy, |
| 1257 | }, | 1257 | }, |
| 1258 | { | 1258 | { |
diff --git a/net/nfc/nfc.h b/net/nfc/nfc.h index ee85a1fc1b24..820a7850c36a 100644 --- a/net/nfc/nfc.h +++ b/net/nfc/nfc.h | |||
| @@ -123,10 +123,10 @@ static inline void nfc_device_iter_exit(struct class_dev_iter *iter) | |||
| 123 | class_dev_iter_exit(iter); | 123 | class_dev_iter_exit(iter); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | int nfc_fw_upload(struct nfc_dev *dev, const char *firmware_name); | 126 | int nfc_fw_download(struct nfc_dev *dev, const char *firmware_name); |
| 127 | int nfc_genl_fw_upload_done(struct nfc_dev *dev, const char *firmware_name); | 127 | int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name); |
| 128 | 128 | ||
| 129 | int nfc_fw_upload_done(struct nfc_dev *dev, const char *firmware_name); | 129 | int nfc_fw_download_done(struct nfc_dev *dev, const char *firmware_name); |
| 130 | 130 | ||
| 131 | int nfc_dev_up(struct nfc_dev *dev); | 131 | int nfc_dev_up(struct nfc_dev *dev); |
| 132 | 132 | ||
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index ca8e0a57d945..1f9c31411f19 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c | |||
| @@ -605,6 +605,7 @@ static int atm_tc_dump_class(struct Qdisc *sch, unsigned long cl, | |||
| 605 | struct sockaddr_atmpvc pvc; | 605 | struct sockaddr_atmpvc pvc; |
| 606 | int state; | 606 | int state; |
| 607 | 607 | ||
| 608 | memset(&pvc, 0, sizeof(pvc)); | ||
| 608 | pvc.sap_family = AF_ATMPVC; | 609 | pvc.sap_family = AF_ATMPVC; |
| 609 | pvc.sap_addr.itf = flow->vcc->dev ? flow->vcc->dev->number : -1; | 610 | pvc.sap_addr.itf = flow->vcc->dev ? flow->vcc->dev->number : -1; |
| 610 | pvc.sap_addr.vpi = flow->vcc->vpi; | 611 | pvc.sap_addr.vpi = flow->vcc->vpi; |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index c2124ea29f45..45e751527dfc 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -100,7 +100,7 @@ struct htb_class { | |||
| 100 | struct psched_ratecfg ceil; | 100 | struct psched_ratecfg ceil; |
| 101 | s64 buffer, cbuffer;/* token bucket depth/rate */ | 101 | s64 buffer, cbuffer;/* token bucket depth/rate */ |
| 102 | s64 mbuffer; /* max wait time */ | 102 | s64 mbuffer; /* max wait time */ |
| 103 | int prio; /* these two are used only by leaves... */ | 103 | u32 prio; /* these two are used only by leaves... */ |
| 104 | int quantum; /* but stored for parent-to-leaf return */ | 104 | int quantum; /* but stored for parent-to-leaf return */ |
| 105 | 105 | ||
| 106 | struct tcf_proto *filter_list; /* class attached filters */ | 106 | struct tcf_proto *filter_list; /* class attached filters */ |
diff --git a/net/socket.c b/net/socket.c index 829b460acb87..b2d7c629eeb9 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -106,7 +106,7 @@ | |||
| 106 | #include <linux/atalk.h> | 106 | #include <linux/atalk.h> |
| 107 | #include <net/busy_poll.h> | 107 | #include <net/busy_poll.h> |
| 108 | 108 | ||
| 109 | #ifdef CONFIG_NET_LL_RX_POLL | 109 | #ifdef CONFIG_NET_RX_BUSY_POLL |
| 110 | unsigned int sysctl_net_busy_read __read_mostly; | 110 | unsigned int sysctl_net_busy_read __read_mostly; |
| 111 | unsigned int sysctl_net_busy_poll __read_mostly; | 111 | unsigned int sysctl_net_busy_poll __read_mostly; |
| 112 | #endif | 112 | #endif |
diff --git a/net/tipc/server.c b/net/tipc/server.c index 19da5abe0fa6..fd3fa57a410e 100644 --- a/net/tipc/server.c +++ b/net/tipc/server.c | |||
| @@ -355,8 +355,12 @@ static int tipc_open_listening_sock(struct tipc_server *s) | |||
| 355 | return PTR_ERR(con); | 355 | return PTR_ERR(con); |
| 356 | 356 | ||
| 357 | sock = tipc_create_listen_sock(con); | 357 | sock = tipc_create_listen_sock(con); |
| 358 | if (!sock) | 358 | if (!sock) { |
| 359 | idr_remove(&s->conn_idr, con->conid); | ||
| 360 | s->idr_in_use--; | ||
| 361 | kfree(con); | ||
| 359 | return -EINVAL; | 362 | return -EINVAL; |
| 363 | } | ||
| 360 | 364 | ||
| 361 | tipc_register_callbacks(sock, con); | 365 | tipc_register_callbacks(sock, con); |
| 362 | return 0; | 366 | return 0; |
| @@ -563,9 +567,14 @@ int tipc_server_start(struct tipc_server *s) | |||
| 563 | kmem_cache_destroy(s->rcvbuf_cache); | 567 | kmem_cache_destroy(s->rcvbuf_cache); |
| 564 | return ret; | 568 | return ret; |
| 565 | } | 569 | } |
| 570 | ret = tipc_open_listening_sock(s); | ||
| 571 | if (ret < 0) { | ||
| 572 | tipc_work_stop(s); | ||
| 573 | kmem_cache_destroy(s->rcvbuf_cache); | ||
| 574 | return ret; | ||
| 575 | } | ||
| 566 | s->enabled = 1; | 576 | s->enabled = 1; |
| 567 | 577 | return ret; | |
| 568 | return tipc_open_listening_sock(s); | ||
| 569 | } | 578 | } |
| 570 | 579 | ||
| 571 | void tipc_server_stop(struct tipc_server *s) | 580 | void tipc_server_stop(struct tipc_server *s) |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 5a950f36bae4..de06d5d1287f 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -2247,10 +2247,13 @@ int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
| 2247 | 2247 | ||
| 2248 | void wiphy_regulatory_register(struct wiphy *wiphy) | 2248 | void wiphy_regulatory_register(struct wiphy *wiphy) |
| 2249 | { | 2249 | { |
| 2250 | struct regulatory_request *lr; | ||
| 2251 | |||
| 2250 | if (!reg_dev_ignore_cell_hint(wiphy)) | 2252 | if (!reg_dev_ignore_cell_hint(wiphy)) |
| 2251 | reg_num_devs_support_basehint++; | 2253 | reg_num_devs_support_basehint++; |
| 2252 | 2254 | ||
| 2253 | wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE); | 2255 | lr = get_last_request(); |
| 2256 | wiphy_update_regulatory(wiphy, lr->initiator); | ||
| 2254 | } | 2257 | } |
| 2255 | 2258 | ||
| 2256 | void wiphy_regulatory_deregister(struct wiphy *wiphy) | 2259 | void wiphy_regulatory_deregister(struct wiphy *wiphy) |
