diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 19:29:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-16 19:29:25 -0400 |
commit | 7a6362800cb7d1d618a697a650c7aaed3eb39320 (patch) | |
tree | 087f9bc6c13ef1fad4b392c5cf9325cd28fa8523 /drivers/s390 | |
parent | 6445ced8670f37cfc2c5e24a9de9b413dbfc788d (diff) | |
parent | ceda86a108671294052cbf51660097b6534672f5 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1480 commits)
bonding: enable netpoll without checking link status
xfrm: Refcount destination entry on xfrm_lookup
net: introduce rx_handler results and logic around that
bonding: get rid of IFF_SLAVE_INACTIVE netdev->priv_flag
bonding: wrap slave state work
net: get rid of multiple bond-related netdevice->priv_flags
bonding: register slave pointer for rx_handler
be2net: Bump up the version number
be2net: Copyright notice change. Update to Emulex instead of ServerEngines
e1000e: fix kconfig for crc32 dependency
netfilter ebtables: fix xt_AUDIT to work with ebtables
xen network backend driver
bonding: Improve syslog message at device creation time
bonding: Call netif_carrier_off after register_netdevice
bonding: Incorrect TX queue offset
net_sched: fix ip_tos2prio
xfrm: fix __xfrm_route_forward()
be2net: Fix UDP packet detected status in RX compl
Phonet: fix aligned-mode pipe socket buffer header reserve
netxen: support for GbE port settings
...
Fix up conflicts in drivers/staging/brcm80211/brcmsmac/wl_mac80211.c
with the staging updates.
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/net/qeth_core.h | 4 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 57 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 45 | ||||
-rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 60 |
4 files changed, 44 insertions, 122 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index f47a714538db..af3f7b095647 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h | |||
@@ -225,7 +225,8 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa, | |||
225 | /*****************************************************************************/ | 225 | /*****************************************************************************/ |
226 | #define QETH_MAX_QUEUES 4 | 226 | #define QETH_MAX_QUEUES 4 |
227 | #define QETH_IN_BUF_SIZE_DEFAULT 65536 | 227 | #define QETH_IN_BUF_SIZE_DEFAULT 65536 |
228 | #define QETH_IN_BUF_COUNT_DEFAULT 16 | 228 | #define QETH_IN_BUF_COUNT_DEFAULT 64 |
229 | #define QETH_IN_BUF_COUNT_HSDEFAULT 128 | ||
229 | #define QETH_IN_BUF_COUNT_MIN 8 | 230 | #define QETH_IN_BUF_COUNT_MIN 8 |
230 | #define QETH_IN_BUF_COUNT_MAX 128 | 231 | #define QETH_IN_BUF_COUNT_MAX 128 |
231 | #define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12) | 232 | #define QETH_MAX_BUFFER_ELEMENTS(card) ((card)->qdio.in_buf_size >> 12) |
@@ -741,7 +742,6 @@ struct qeth_card { | |||
741 | /* QDIO buffer handling */ | 742 | /* QDIO buffer handling */ |
742 | struct qeth_qdio_info qdio; | 743 | struct qeth_qdio_info qdio; |
743 | struct qeth_perf_stats perf_stats; | 744 | struct qeth_perf_stats perf_stats; |
744 | int use_hard_stop; | ||
745 | int read_or_write_problem; | 745 | int read_or_write_problem; |
746 | struct qeth_osn_info osn_info; | 746 | struct qeth_osn_info osn_info; |
747 | struct qeth_discipline discipline; | 747 | struct qeth_discipline discipline; |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 019ae58ab913..25eef304bd47 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -302,12 +302,15 @@ static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc, | |||
302 | int com = cmd->hdr.command; | 302 | int com = cmd->hdr.command; |
303 | ipa_name = qeth_get_ipa_cmd_name(com); | 303 | ipa_name = qeth_get_ipa_cmd_name(com); |
304 | if (rc) | 304 | if (rc) |
305 | QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s returned x%X \"%s\"\n", | 305 | QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s/%s returned " |
306 | ipa_name, com, QETH_CARD_IFNAME(card), | 306 | "x%X \"%s\"\n", |
307 | rc, qeth_get_ipa_msg(rc)); | 307 | ipa_name, com, dev_name(&card->gdev->dev), |
308 | QETH_CARD_IFNAME(card), rc, | ||
309 | qeth_get_ipa_msg(rc)); | ||
308 | else | 310 | else |
309 | QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s succeeded\n", | 311 | QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s/%s succeeded\n", |
310 | ipa_name, com, QETH_CARD_IFNAME(card)); | 312 | ipa_name, com, dev_name(&card->gdev->dev), |
313 | QETH_CARD_IFNAME(card)); | ||
311 | } | 314 | } |
312 | 315 | ||
313 | static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, | 316 | static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, |
@@ -1023,7 +1026,10 @@ static void qeth_init_qdio_info(struct qeth_card *card) | |||
1023 | atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); | 1026 | atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); |
1024 | /* inbound */ | 1027 | /* inbound */ |
1025 | card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT; | 1028 | card->qdio.in_buf_size = QETH_IN_BUF_SIZE_DEFAULT; |
1026 | card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT; | 1029 | if (card->info.type == QETH_CARD_TYPE_IQD) |
1030 | card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_HSDEFAULT; | ||
1031 | else | ||
1032 | card->qdio.init_pool.buf_count = QETH_IN_BUF_COUNT_DEFAULT; | ||
1027 | card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count; | 1033 | card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count; |
1028 | INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list); | 1034 | INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list); |
1029 | INIT_LIST_HEAD(&card->qdio.init_pool.entry_list); | 1035 | INIT_LIST_HEAD(&card->qdio.init_pool.entry_list); |
@@ -1083,7 +1089,6 @@ static int qeth_setup_card(struct qeth_card *card) | |||
1083 | card->data.state = CH_STATE_DOWN; | 1089 | card->data.state = CH_STATE_DOWN; |
1084 | card->state = CARD_STATE_DOWN; | 1090 | card->state = CARD_STATE_DOWN; |
1085 | card->lan_online = 0; | 1091 | card->lan_online = 0; |
1086 | card->use_hard_stop = 0; | ||
1087 | card->read_or_write_problem = 0; | 1092 | card->read_or_write_problem = 0; |
1088 | card->dev = NULL; | 1093 | card->dev = NULL; |
1089 | spin_lock_init(&card->vlanlock); | 1094 | spin_lock_init(&card->vlanlock); |
@@ -1732,20 +1737,22 @@ int qeth_send_control_data(struct qeth_card *card, int len, | |||
1732 | }; | 1737 | }; |
1733 | } | 1738 | } |
1734 | 1739 | ||
1740 | if (reply->rc == -EIO) | ||
1741 | goto error; | ||
1735 | rc = reply->rc; | 1742 | rc = reply->rc; |
1736 | qeth_put_reply(reply); | 1743 | qeth_put_reply(reply); |
1737 | return rc; | 1744 | return rc; |
1738 | 1745 | ||
1739 | time_err: | 1746 | time_err: |
1747 | reply->rc = -ETIME; | ||
1740 | spin_lock_irqsave(&reply->card->lock, flags); | 1748 | spin_lock_irqsave(&reply->card->lock, flags); |
1741 | list_del_init(&reply->list); | 1749 | list_del_init(&reply->list); |
1742 | spin_unlock_irqrestore(&reply->card->lock, flags); | 1750 | spin_unlock_irqrestore(&reply->card->lock, flags); |
1743 | reply->rc = -ETIME; | ||
1744 | atomic_inc(&reply->received); | 1751 | atomic_inc(&reply->received); |
1752 | error: | ||
1745 | atomic_set(&card->write.irq_pending, 0); | 1753 | atomic_set(&card->write.irq_pending, 0); |
1746 | qeth_release_buffer(iob->channel, iob); | 1754 | qeth_release_buffer(iob->channel, iob); |
1747 | card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO; | 1755 | card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO; |
1748 | wake_up(&reply->wait_q); | ||
1749 | rc = reply->rc; | 1756 | rc = reply->rc; |
1750 | qeth_put_reply(reply); | 1757 | qeth_put_reply(reply); |
1751 | return rc; | 1758 | return rc; |
@@ -2490,45 +2497,19 @@ int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, | |||
2490 | } | 2497 | } |
2491 | EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd); | 2498 | EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd); |
2492 | 2499 | ||
2493 | static int qeth_send_startstoplan(struct qeth_card *card, | ||
2494 | enum qeth_ipa_cmds ipacmd, enum qeth_prot_versions prot) | ||
2495 | { | ||
2496 | int rc; | ||
2497 | struct qeth_cmd_buffer *iob; | ||
2498 | |||
2499 | iob = qeth_get_ipacmd_buffer(card, ipacmd, prot); | ||
2500 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); | ||
2501 | |||
2502 | return rc; | ||
2503 | } | ||
2504 | |||
2505 | int qeth_send_startlan(struct qeth_card *card) | 2500 | int qeth_send_startlan(struct qeth_card *card) |
2506 | { | 2501 | { |
2507 | int rc; | 2502 | int rc; |
2503 | struct qeth_cmd_buffer *iob; | ||
2508 | 2504 | ||
2509 | QETH_DBF_TEXT(SETUP, 2, "strtlan"); | 2505 | QETH_DBF_TEXT(SETUP, 2, "strtlan"); |
2510 | 2506 | ||
2511 | rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, 0); | 2507 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0); |
2508 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); | ||
2512 | return rc; | 2509 | return rc; |
2513 | } | 2510 | } |
2514 | EXPORT_SYMBOL_GPL(qeth_send_startlan); | 2511 | EXPORT_SYMBOL_GPL(qeth_send_startlan); |
2515 | 2512 | ||
2516 | int qeth_send_stoplan(struct qeth_card *card) | ||
2517 | { | ||
2518 | int rc = 0; | ||
2519 | |||
2520 | /* | ||
2521 | * TODO: according to the IPA format document page 14, | ||
2522 | * TCP/IP (we!) never issue a STOPLAN | ||
2523 | * is this right ?!? | ||
2524 | */ | ||
2525 | QETH_DBF_TEXT(SETUP, 2, "stoplan"); | ||
2526 | |||
2527 | rc = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, 0); | ||
2528 | return rc; | ||
2529 | } | ||
2530 | EXPORT_SYMBOL_GPL(qeth_send_stoplan); | ||
2531 | |||
2532 | int qeth_default_setadapterparms_cb(struct qeth_card *card, | 2513 | int qeth_default_setadapterparms_cb(struct qeth_card *card, |
2533 | struct qeth_reply *reply, unsigned long data) | 2514 | struct qeth_reply *reply, unsigned long data) |
2534 | { | 2515 | { |
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index ada0fe782373..6fbaacb21943 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -202,17 +202,19 @@ static void qeth_l2_add_mc(struct qeth_card *card, __u8 *mac, int vmac) | |||
202 | kfree(mc); | 202 | kfree(mc); |
203 | } | 203 | } |
204 | 204 | ||
205 | static void qeth_l2_del_all_mc(struct qeth_card *card) | 205 | static void qeth_l2_del_all_mc(struct qeth_card *card, int del) |
206 | { | 206 | { |
207 | struct qeth_mc_mac *mc, *tmp; | 207 | struct qeth_mc_mac *mc, *tmp; |
208 | 208 | ||
209 | spin_lock_bh(&card->mclock); | 209 | spin_lock_bh(&card->mclock); |
210 | list_for_each_entry_safe(mc, tmp, &card->mc_list, list) { | 210 | list_for_each_entry_safe(mc, tmp, &card->mc_list, list) { |
211 | if (mc->is_vmac) | 211 | if (del) { |
212 | qeth_l2_send_setdelmac(card, mc->mc_addr, | 212 | if (mc->is_vmac) |
213 | qeth_l2_send_setdelmac(card, mc->mc_addr, | ||
213 | IPA_CMD_DELVMAC, NULL); | 214 | IPA_CMD_DELVMAC, NULL); |
214 | else | 215 | else |
215 | qeth_l2_send_delgroupmac(card, mc->mc_addr); | 216 | qeth_l2_send_delgroupmac(card, mc->mc_addr); |
217 | } | ||
216 | list_del(&mc->list); | 218 | list_del(&mc->list); |
217 | kfree(mc); | 219 | kfree(mc); |
218 | } | 220 | } |
@@ -288,18 +290,13 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i, | |||
288 | qeth_l2_send_setdelvlan_cb, NULL); | 290 | qeth_l2_send_setdelvlan_cb, NULL); |
289 | } | 291 | } |
290 | 292 | ||
291 | static void qeth_l2_process_vlans(struct qeth_card *card, int clear) | 293 | static void qeth_l2_process_vlans(struct qeth_card *card) |
292 | { | 294 | { |
293 | struct qeth_vlan_vid *id; | 295 | struct qeth_vlan_vid *id; |
294 | QETH_CARD_TEXT(card, 3, "L2prcvln"); | 296 | QETH_CARD_TEXT(card, 3, "L2prcvln"); |
295 | spin_lock_bh(&card->vlanlock); | 297 | spin_lock_bh(&card->vlanlock); |
296 | list_for_each_entry(id, &card->vid_list, list) { | 298 | list_for_each_entry(id, &card->vid_list, list) { |
297 | if (clear) | 299 | qeth_l2_send_setdelvlan(card, id->vid, IPA_CMD_SETVLAN); |
298 | qeth_l2_send_setdelvlan(card, id->vid, | ||
299 | IPA_CMD_DELVLAN); | ||
300 | else | ||
301 | qeth_l2_send_setdelvlan(card, id->vid, | ||
302 | IPA_CMD_SETVLAN); | ||
303 | } | 300 | } |
304 | spin_unlock_bh(&card->vlanlock); | 301 | spin_unlock_bh(&card->vlanlock); |
305 | } | 302 | } |
@@ -379,19 +376,11 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | |||
379 | dev_close(card->dev); | 376 | dev_close(card->dev); |
380 | rtnl_unlock(); | 377 | rtnl_unlock(); |
381 | } | 378 | } |
382 | if (!card->use_hard_stop || | 379 | card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; |
383 | recovery_mode) { | ||
384 | __u8 *mac = &card->dev->dev_addr[0]; | ||
385 | rc = qeth_l2_send_delmac(card, mac); | ||
386 | QETH_DBF_TEXT_(SETUP, 2, "Lerr%d", rc); | ||
387 | } | ||
388 | card->state = CARD_STATE_SOFTSETUP; | 380 | card->state = CARD_STATE_SOFTSETUP; |
389 | } | 381 | } |
390 | if (card->state == CARD_STATE_SOFTSETUP) { | 382 | if (card->state == CARD_STATE_SOFTSETUP) { |
391 | qeth_l2_process_vlans(card, 1); | 383 | qeth_l2_del_all_mc(card, 0); |
392 | if (!card->use_hard_stop || | ||
393 | recovery_mode) | ||
394 | qeth_l2_del_all_mc(card); | ||
395 | qeth_clear_ipacmd_list(card); | 384 | qeth_clear_ipacmd_list(card); |
396 | card->state = CARD_STATE_HARDSETUP; | 385 | card->state = CARD_STATE_HARDSETUP; |
397 | } | 386 | } |
@@ -405,7 +394,6 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | |||
405 | qeth_clear_cmd_buffers(&card->read); | 394 | qeth_clear_cmd_buffers(&card->read); |
406 | qeth_clear_cmd_buffers(&card->write); | 395 | qeth_clear_cmd_buffers(&card->write); |
407 | } | 396 | } |
408 | card->use_hard_stop = 0; | ||
409 | return rc; | 397 | return rc; |
410 | } | 398 | } |
411 | 399 | ||
@@ -705,7 +693,7 @@ static void qeth_l2_set_multicast_list(struct net_device *dev) | |||
705 | if (qeth_threads_running(card, QETH_RECOVER_THREAD) && | 693 | if (qeth_threads_running(card, QETH_RECOVER_THREAD) && |
706 | (card->state != CARD_STATE_UP)) | 694 | (card->state != CARD_STATE_UP)) |
707 | return; | 695 | return; |
708 | qeth_l2_del_all_mc(card); | 696 | qeth_l2_del_all_mc(card, 1); |
709 | spin_lock_bh(&card->mclock); | 697 | spin_lock_bh(&card->mclock); |
710 | netdev_for_each_mc_addr(ha, dev) | 698 | netdev_for_each_mc_addr(ha, dev) |
711 | qeth_l2_add_mc(card, ha->addr, 0); | 699 | qeth_l2_add_mc(card, ha->addr, 0); |
@@ -907,10 +895,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev) | |||
907 | qeth_set_allowed_threads(card, 0, 1); | 895 | qeth_set_allowed_threads(card, 0, 1); |
908 | wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); | 896 | wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); |
909 | 897 | ||
910 | if (cgdev->state == CCWGROUP_ONLINE) { | 898 | if (cgdev->state == CCWGROUP_ONLINE) |
911 | card->use_hard_stop = 1; | ||
912 | qeth_l2_set_offline(cgdev); | 899 | qeth_l2_set_offline(cgdev); |
913 | } | ||
914 | 900 | ||
915 | if (card->dev) { | 901 | if (card->dev) { |
916 | unregister_netdev(card->dev); | 902 | unregister_netdev(card->dev); |
@@ -1040,7 +1026,7 @@ contin: | |||
1040 | 1026 | ||
1041 | if (card->info.type != QETH_CARD_TYPE_OSN && | 1027 | if (card->info.type != QETH_CARD_TYPE_OSN && |
1042 | card->info.type != QETH_CARD_TYPE_OSM) | 1028 | card->info.type != QETH_CARD_TYPE_OSM) |
1043 | qeth_l2_process_vlans(card, 0); | 1029 | qeth_l2_process_vlans(card); |
1044 | 1030 | ||
1045 | netif_tx_disable(card->dev); | 1031 | netif_tx_disable(card->dev); |
1046 | 1032 | ||
@@ -1076,7 +1062,6 @@ contin: | |||
1076 | return 0; | 1062 | return 0; |
1077 | 1063 | ||
1078 | out_remove: | 1064 | out_remove: |
1079 | card->use_hard_stop = 1; | ||
1080 | qeth_l2_stop_card(card, 0); | 1065 | qeth_l2_stop_card(card, 0); |
1081 | ccw_device_set_offline(CARD_DDEV(card)); | 1066 | ccw_device_set_offline(CARD_DDEV(card)); |
1082 | ccw_device_set_offline(CARD_WDEV(card)); | 1067 | ccw_device_set_offline(CARD_WDEV(card)); |
@@ -1144,7 +1129,6 @@ static int qeth_l2_recover(void *ptr) | |||
1144 | QETH_CARD_TEXT(card, 2, "recover2"); | 1129 | QETH_CARD_TEXT(card, 2, "recover2"); |
1145 | dev_warn(&card->gdev->dev, | 1130 | dev_warn(&card->gdev->dev, |
1146 | "A recovery process has been started for the device\n"); | 1131 | "A recovery process has been started for the device\n"); |
1147 | card->use_hard_stop = 1; | ||
1148 | __qeth_l2_set_offline(card->gdev, 1); | 1132 | __qeth_l2_set_offline(card->gdev, 1); |
1149 | rc = __qeth_l2_set_online(card->gdev, 1); | 1133 | rc = __qeth_l2_set_online(card->gdev, 1); |
1150 | if (!rc) | 1134 | if (!rc) |
@@ -1191,7 +1175,6 @@ static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev) | |||
1191 | if (gdev->state == CCWGROUP_OFFLINE) | 1175 | if (gdev->state == CCWGROUP_OFFLINE) |
1192 | return 0; | 1176 | return 0; |
1193 | if (card->state == CARD_STATE_UP) { | 1177 | if (card->state == CARD_STATE_UP) { |
1194 | card->use_hard_stop = 1; | ||
1195 | __qeth_l2_set_offline(card->gdev, 1); | 1178 | __qeth_l2_set_offline(card->gdev, 1); |
1196 | } else | 1179 | } else |
1197 | __qeth_l2_set_offline(card->gdev, 0); | 1180 | __qeth_l2_set_offline(card->gdev, 0); |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index d09b0c44fc3d..142e5f6ef4f3 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -510,8 +510,7 @@ static void qeth_l3_set_ip_addr_list(struct qeth_card *card) | |||
510 | kfree(tbd_list); | 510 | kfree(tbd_list); |
511 | } | 511 | } |
512 | 512 | ||
513 | static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean, | 513 | static void qeth_l3_clear_ip_list(struct qeth_card *card, int recover) |
514 | int recover) | ||
515 | { | 514 | { |
516 | struct qeth_ipaddr *addr, *tmp; | 515 | struct qeth_ipaddr *addr, *tmp; |
517 | unsigned long flags; | 516 | unsigned long flags; |
@@ -530,11 +529,6 @@ static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean, | |||
530 | addr = list_entry(card->ip_list.next, | 529 | addr = list_entry(card->ip_list.next, |
531 | struct qeth_ipaddr, entry); | 530 | struct qeth_ipaddr, entry); |
532 | list_del_init(&addr->entry); | 531 | list_del_init(&addr->entry); |
533 | if (clean) { | ||
534 | spin_unlock_irqrestore(&card->ip_lock, flags); | ||
535 | qeth_l3_deregister_addr_entry(card, addr); | ||
536 | spin_lock_irqsave(&card->ip_lock, flags); | ||
537 | } | ||
538 | if (!recover || addr->is_multicast) { | 532 | if (!recover || addr->is_multicast) { |
539 | kfree(addr); | 533 | kfree(addr); |
540 | continue; | 534 | continue; |
@@ -1611,29 +1605,6 @@ static int qeth_l3_start_ipassists(struct qeth_card *card) | |||
1611 | return 0; | 1605 | return 0; |
1612 | } | 1606 | } |
1613 | 1607 | ||
1614 | static int qeth_l3_put_unique_id(struct qeth_card *card) | ||
1615 | { | ||
1616 | |||
1617 | int rc = 0; | ||
1618 | struct qeth_cmd_buffer *iob; | ||
1619 | struct qeth_ipa_cmd *cmd; | ||
1620 | |||
1621 | QETH_CARD_TEXT(card, 2, "puniqeid"); | ||
1622 | |||
1623 | if ((card->info.unique_id & UNIQUE_ID_NOT_BY_CARD) == | ||
1624 | UNIQUE_ID_NOT_BY_CARD) | ||
1625 | return -1; | ||
1626 | iob = qeth_get_ipacmd_buffer(card, IPA_CMD_DESTROY_ADDR, | ||
1627 | QETH_PROT_IPV6); | ||
1628 | cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); | ||
1629 | *((__u16 *) &cmd->data.create_destroy_addr.unique_id[6]) = | ||
1630 | card->info.unique_id; | ||
1631 | memcpy(&cmd->data.create_destroy_addr.unique_id[0], | ||
1632 | card->dev->dev_addr, OSA_ADDR_LEN); | ||
1633 | rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); | ||
1634 | return rc; | ||
1635 | } | ||
1636 | |||
1637 | static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, | 1608 | static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, |
1638 | struct qeth_reply *reply, unsigned long data) | 1609 | struct qeth_reply *reply, unsigned long data) |
1639 | { | 1610 | { |
@@ -2324,25 +2295,14 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) | |||
2324 | dev_close(card->dev); | 2295 | dev_close(card->dev); |
2325 | rtnl_unlock(); | 2296 | rtnl_unlock(); |
2326 | } | 2297 | } |
2327 | if (!card->use_hard_stop) { | ||
2328 | rc = qeth_send_stoplan(card); | ||
2329 | if (rc) | ||
2330 | QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); | ||
2331 | } | ||
2332 | card->state = CARD_STATE_SOFTSETUP; | 2298 | card->state = CARD_STATE_SOFTSETUP; |
2333 | } | 2299 | } |
2334 | if (card->state == CARD_STATE_SOFTSETUP) { | 2300 | if (card->state == CARD_STATE_SOFTSETUP) { |
2335 | qeth_l3_clear_ip_list(card, !card->use_hard_stop, 1); | 2301 | qeth_l3_clear_ip_list(card, 1); |
2336 | qeth_clear_ipacmd_list(card); | 2302 | qeth_clear_ipacmd_list(card); |
2337 | card->state = CARD_STATE_HARDSETUP; | 2303 | card->state = CARD_STATE_HARDSETUP; |
2338 | } | 2304 | } |
2339 | if (card->state == CARD_STATE_HARDSETUP) { | 2305 | if (card->state == CARD_STATE_HARDSETUP) { |
2340 | if (!card->use_hard_stop && | ||
2341 | (card->info.type != QETH_CARD_TYPE_IQD)) { | ||
2342 | rc = qeth_l3_put_unique_id(card); | ||
2343 | if (rc) | ||
2344 | QETH_DBF_TEXT_(SETUP, 2, "2err%d", rc); | ||
2345 | } | ||
2346 | qeth_qdio_clear_card(card, 0); | 2306 | qeth_qdio_clear_card(card, 0); |
2347 | qeth_clear_qdio_buffers(card); | 2307 | qeth_clear_qdio_buffers(card); |
2348 | qeth_clear_working_pool_list(card); | 2308 | qeth_clear_working_pool_list(card); |
@@ -2352,7 +2312,6 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) | |||
2352 | qeth_clear_cmd_buffers(&card->read); | 2312 | qeth_clear_cmd_buffers(&card->read); |
2353 | qeth_clear_cmd_buffers(&card->write); | 2313 | qeth_clear_cmd_buffers(&card->write); |
2354 | } | 2314 | } |
2355 | card->use_hard_stop = 0; | ||
2356 | return rc; | 2315 | return rc; |
2357 | } | 2316 | } |
2358 | 2317 | ||
@@ -3433,6 +3392,8 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | |||
3433 | if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) | 3392 | if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) |
3434 | card->dev->dev_id = card->info.unique_id & | 3393 | card->dev->dev_id = card->info.unique_id & |
3435 | 0xffff; | 3394 | 0xffff; |
3395 | if (!card->info.guestlan) | ||
3396 | card->dev->features |= NETIF_F_GRO; | ||
3436 | } | 3397 | } |
3437 | } else if (card->info.type == QETH_CARD_TYPE_IQD) { | 3398 | } else if (card->info.type == QETH_CARD_TYPE_IQD) { |
3438 | card->dev = alloc_netdev(0, "hsi%d", ether_setup); | 3399 | card->dev = alloc_netdev(0, "hsi%d", ether_setup); |
@@ -3471,6 +3432,9 @@ static int qeth_l3_probe_device(struct ccwgroup_device *gdev) | |||
3471 | card->discipline.output_handler = (qdio_handler_t *) | 3432 | card->discipline.output_handler = (qdio_handler_t *) |
3472 | qeth_qdio_output_handler; | 3433 | qeth_qdio_output_handler; |
3473 | card->discipline.recover = qeth_l3_recover; | 3434 | card->discipline.recover = qeth_l3_recover; |
3435 | if ((card->info.type == QETH_CARD_TYPE_OSD) || | ||
3436 | (card->info.type == QETH_CARD_TYPE_OSX)) | ||
3437 | card->options.checksum_type = HW_CHECKSUMMING; | ||
3474 | return 0; | 3438 | return 0; |
3475 | } | 3439 | } |
3476 | 3440 | ||
@@ -3483,17 +3447,15 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev) | |||
3483 | qeth_set_allowed_threads(card, 0, 1); | 3447 | qeth_set_allowed_threads(card, 0, 1); |
3484 | wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); | 3448 | wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); |
3485 | 3449 | ||
3486 | if (cgdev->state == CCWGROUP_ONLINE) { | 3450 | if (cgdev->state == CCWGROUP_ONLINE) |
3487 | card->use_hard_stop = 1; | ||
3488 | qeth_l3_set_offline(cgdev); | 3451 | qeth_l3_set_offline(cgdev); |
3489 | } | ||
3490 | 3452 | ||
3491 | if (card->dev) { | 3453 | if (card->dev) { |
3492 | unregister_netdev(card->dev); | 3454 | unregister_netdev(card->dev); |
3493 | card->dev = NULL; | 3455 | card->dev = NULL; |
3494 | } | 3456 | } |
3495 | 3457 | ||
3496 | qeth_l3_clear_ip_list(card, 0, 0); | 3458 | qeth_l3_clear_ip_list(card, 0); |
3497 | qeth_l3_clear_ipato_list(card); | 3459 | qeth_l3_clear_ipato_list(card); |
3498 | return; | 3460 | return; |
3499 | } | 3461 | } |
@@ -3594,7 +3556,6 @@ contin: | |||
3594 | mutex_unlock(&card->discipline_mutex); | 3556 | mutex_unlock(&card->discipline_mutex); |
3595 | return 0; | 3557 | return 0; |
3596 | out_remove: | 3558 | out_remove: |
3597 | card->use_hard_stop = 1; | ||
3598 | qeth_l3_stop_card(card, 0); | 3559 | qeth_l3_stop_card(card, 0); |
3599 | ccw_device_set_offline(CARD_DDEV(card)); | 3560 | ccw_device_set_offline(CARD_DDEV(card)); |
3600 | ccw_device_set_offline(CARD_WDEV(card)); | 3561 | ccw_device_set_offline(CARD_WDEV(card)); |
@@ -3663,7 +3624,6 @@ static int qeth_l3_recover(void *ptr) | |||
3663 | QETH_CARD_TEXT(card, 2, "recover2"); | 3624 | QETH_CARD_TEXT(card, 2, "recover2"); |
3664 | dev_warn(&card->gdev->dev, | 3625 | dev_warn(&card->gdev->dev, |
3665 | "A recovery process has been started for the device\n"); | 3626 | "A recovery process has been started for the device\n"); |
3666 | card->use_hard_stop = 1; | ||
3667 | __qeth_l3_set_offline(card->gdev, 1); | 3627 | __qeth_l3_set_offline(card->gdev, 1); |
3668 | rc = __qeth_l3_set_online(card->gdev, 1); | 3628 | rc = __qeth_l3_set_online(card->gdev, 1); |
3669 | if (!rc) | 3629 | if (!rc) |
@@ -3684,7 +3644,6 @@ static int qeth_l3_recover(void *ptr) | |||
3684 | static void qeth_l3_shutdown(struct ccwgroup_device *gdev) | 3644 | static void qeth_l3_shutdown(struct ccwgroup_device *gdev) |
3685 | { | 3645 | { |
3686 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); | 3646 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); |
3687 | qeth_l3_clear_ip_list(card, 0, 0); | ||
3688 | qeth_qdio_clear_card(card, 0); | 3647 | qeth_qdio_clear_card(card, 0); |
3689 | qeth_clear_qdio_buffers(card); | 3648 | qeth_clear_qdio_buffers(card); |
3690 | } | 3649 | } |
@@ -3700,7 +3659,6 @@ static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev) | |||
3700 | if (gdev->state == CCWGROUP_OFFLINE) | 3659 | if (gdev->state == CCWGROUP_OFFLINE) |
3701 | return 0; | 3660 | return 0; |
3702 | if (card->state == CARD_STATE_UP) { | 3661 | if (card->state == CARD_STATE_UP) { |
3703 | card->use_hard_stop = 1; | ||
3704 | __qeth_l3_set_offline(card->gdev, 1); | 3662 | __qeth_l3_set_offline(card->gdev, 1); |
3705 | } else | 3663 | } else |
3706 | __qeth_l3_set_offline(card->gdev, 0); | 3664 | __qeth_l3_set_offline(card->gdev, 0); |