aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net/qeth_l3_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/net/qeth_l3_main.c')
-rw-r--r--drivers/s390/net/qeth_l3_main.c55
1 files changed, 4 insertions, 51 deletions
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index d09b0c44fc3..6a9cc58321a 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);