aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/s390/net/qeth_core.h1
-rw-r--r--drivers/s390/net/qeth_core_main.c52
-rw-r--r--drivers/s390/net/qeth_l2_main.c45
-rw-r--r--drivers/s390/net/qeth_l3_main.c55
4 files changed, 33 insertions, 120 deletions
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index f47a714538db..c5d763ed406e 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -741,7 +741,6 @@ struct qeth_card {
741 /* QDIO buffer handling */ 741 /* QDIO buffer handling */
742 struct qeth_qdio_info qdio; 742 struct qeth_qdio_info qdio;
743 struct qeth_perf_stats perf_stats; 743 struct qeth_perf_stats perf_stats;
744 int use_hard_stop;
745 int read_or_write_problem; 744 int read_or_write_problem;
746 struct qeth_osn_info osn_info; 745 struct qeth_osn_info osn_info;
747 struct qeth_discipline discipline; 746 struct qeth_discipline discipline;
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 019ae58ab913..f3d98ac16e9f 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
313static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, 316static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
@@ -1083,7 +1086,6 @@ static int qeth_setup_card(struct qeth_card *card)
1083 card->data.state = CH_STATE_DOWN; 1086 card->data.state = CH_STATE_DOWN;
1084 card->state = CARD_STATE_DOWN; 1087 card->state = CARD_STATE_DOWN;
1085 card->lan_online = 0; 1088 card->lan_online = 0;
1086 card->use_hard_stop = 0;
1087 card->read_or_write_problem = 0; 1089 card->read_or_write_problem = 0;
1088 card->dev = NULL; 1090 card->dev = NULL;
1089 spin_lock_init(&card->vlanlock); 1091 spin_lock_init(&card->vlanlock);
@@ -1732,20 +1734,22 @@ int qeth_send_control_data(struct qeth_card *card, int len,
1732 }; 1734 };
1733 } 1735 }
1734 1736
1737 if (reply->rc == -EIO)
1738 goto error;
1735 rc = reply->rc; 1739 rc = reply->rc;
1736 qeth_put_reply(reply); 1740 qeth_put_reply(reply);
1737 return rc; 1741 return rc;
1738 1742
1739time_err: 1743time_err:
1744 reply->rc = -ETIME;
1740 spin_lock_irqsave(&reply->card->lock, flags); 1745 spin_lock_irqsave(&reply->card->lock, flags);
1741 list_del_init(&reply->list); 1746 list_del_init(&reply->list);
1742 spin_unlock_irqrestore(&reply->card->lock, flags); 1747 spin_unlock_irqrestore(&reply->card->lock, flags);
1743 reply->rc = -ETIME;
1744 atomic_inc(&reply->received); 1748 atomic_inc(&reply->received);
1749error:
1745 atomic_set(&card->write.irq_pending, 0); 1750 atomic_set(&card->write.irq_pending, 0);
1746 qeth_release_buffer(iob->channel, iob); 1751 qeth_release_buffer(iob->channel, iob);
1747 card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO; 1752 card->write.buf_no = (card->write.buf_no + 1) % QETH_CMD_BUFFER_NO;
1748 wake_up(&reply->wait_q);
1749 rc = reply->rc; 1753 rc = reply->rc;
1750 qeth_put_reply(reply); 1754 qeth_put_reply(reply);
1751 return rc; 1755 return rc;
@@ -2490,45 +2494,19 @@ int qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
2490} 2494}
2491EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd); 2495EXPORT_SYMBOL_GPL(qeth_send_ipa_cmd);
2492 2496
2493static 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
2505int qeth_send_startlan(struct qeth_card *card) 2497int qeth_send_startlan(struct qeth_card *card)
2506{ 2498{
2507 int rc; 2499 int rc;
2500 struct qeth_cmd_buffer *iob;
2508 2501
2509 QETH_DBF_TEXT(SETUP, 2, "strtlan"); 2502 QETH_DBF_TEXT(SETUP, 2, "strtlan");
2510 2503
2511 rc = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, 0); 2504 iob = qeth_get_ipacmd_buffer(card, IPA_CMD_STARTLAN, 0);
2505 rc = qeth_send_ipa_cmd(card, iob, NULL, NULL);
2512 return rc; 2506 return rc;
2513} 2507}
2514EXPORT_SYMBOL_GPL(qeth_send_startlan); 2508EXPORT_SYMBOL_GPL(qeth_send_startlan);
2515 2509
2516int 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}
2530EXPORT_SYMBOL_GPL(qeth_send_stoplan);
2531
2532int qeth_default_setadapterparms_cb(struct qeth_card *card, 2510int qeth_default_setadapterparms_cb(struct qeth_card *card,
2533 struct qeth_reply *reply, unsigned long data) 2511 struct qeth_reply *reply, unsigned long data)
2534{ 2512{
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
205static void qeth_l2_del_all_mc(struct qeth_card *card) 205static 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
291static void qeth_l2_process_vlans(struct qeth_card *card, int clear) 293static 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
1078out_remove: 1064out_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..6a9cc58321a0 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
513static void qeth_l3_clear_ip_list(struct qeth_card *card, int clean, 513static 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
1614static 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
1637static int qeth_l3_iqd_read_initial_mac_cb(struct qeth_card *card, 1608static 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
@@ -3483,17 +3442,15 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
3483 qeth_set_allowed_threads(card, 0, 1); 3442 qeth_set_allowed_threads(card, 0, 1);
3484 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); 3443 wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
3485 3444
3486 if (cgdev->state == CCWGROUP_ONLINE) { 3445 if (cgdev->state == CCWGROUP_ONLINE)
3487 card->use_hard_stop = 1;
3488 qeth_l3_set_offline(cgdev); 3446 qeth_l3_set_offline(cgdev);
3489 }
3490 3447
3491 if (card->dev) { 3448 if (card->dev) {
3492 unregister_netdev(card->dev); 3449 unregister_netdev(card->dev);
3493 card->dev = NULL; 3450 card->dev = NULL;
3494 } 3451 }
3495 3452
3496 qeth_l3_clear_ip_list(card, 0, 0); 3453 qeth_l3_clear_ip_list(card, 0);
3497 qeth_l3_clear_ipato_list(card); 3454 qeth_l3_clear_ipato_list(card);
3498 return; 3455 return;
3499} 3456}
@@ -3594,7 +3551,6 @@ contin:
3594 mutex_unlock(&card->discipline_mutex); 3551 mutex_unlock(&card->discipline_mutex);
3595 return 0; 3552 return 0;
3596out_remove: 3553out_remove:
3597 card->use_hard_stop = 1;
3598 qeth_l3_stop_card(card, 0); 3554 qeth_l3_stop_card(card, 0);
3599 ccw_device_set_offline(CARD_DDEV(card)); 3555 ccw_device_set_offline(CARD_DDEV(card));
3600 ccw_device_set_offline(CARD_WDEV(card)); 3556 ccw_device_set_offline(CARD_WDEV(card));
@@ -3663,7 +3619,6 @@ static int qeth_l3_recover(void *ptr)
3663 QETH_CARD_TEXT(card, 2, "recover2"); 3619 QETH_CARD_TEXT(card, 2, "recover2");
3664 dev_warn(&card->gdev->dev, 3620 dev_warn(&card->gdev->dev,
3665 "A recovery process has been started for the device\n"); 3621 "A recovery process has been started for the device\n");
3666 card->use_hard_stop = 1;
3667 __qeth_l3_set_offline(card->gdev, 1); 3622 __qeth_l3_set_offline(card->gdev, 1);
3668 rc = __qeth_l3_set_online(card->gdev, 1); 3623 rc = __qeth_l3_set_online(card->gdev, 1);
3669 if (!rc) 3624 if (!rc)
@@ -3684,7 +3639,6 @@ static int qeth_l3_recover(void *ptr)
3684static void qeth_l3_shutdown(struct ccwgroup_device *gdev) 3639static void qeth_l3_shutdown(struct ccwgroup_device *gdev)
3685{ 3640{
3686 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 3641 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); 3642 qeth_qdio_clear_card(card, 0);
3689 qeth_clear_qdio_buffers(card); 3643 qeth_clear_qdio_buffers(card);
3690} 3644}
@@ -3700,7 +3654,6 @@ static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev)
3700 if (gdev->state == CCWGROUP_OFFLINE) 3654 if (gdev->state == CCWGROUP_OFFLINE)
3701 return 0; 3655 return 0;
3702 if (card->state == CARD_STATE_UP) { 3656 if (card->state == CARD_STATE_UP) {
3703 card->use_hard_stop = 1;
3704 __qeth_l3_set_offline(card->gdev, 1); 3657 __qeth_l3_set_offline(card->gdev, 1);
3705 } else 3658 } else
3706 __qeth_l3_set_offline(card->gdev, 0); 3659 __qeth_l3_set_offline(card->gdev, 0);