diff options
Diffstat (limited to 'drivers/s390/net/qeth_l3_main.c')
-rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 55 |
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 | ||
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 | ||
@@ -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; |
3596 | out_remove: | 3553 | out_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) | |||
3684 | static void qeth_l3_shutdown(struct ccwgroup_device *gdev) | 3639 | static 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); |