diff options
Diffstat (limited to 'drivers/s390/net/qeth_l3_main.c')
-rw-r--r-- | drivers/s390/net/qeth_l3_main.c | 207 |
1 files changed, 70 insertions, 137 deletions
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 0b161cc1fd2e..f08b745c2007 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -278,9 +278,6 @@ static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover) | |||
278 | 278 | ||
279 | QETH_CARD_TEXT(card, 4, "clearip"); | 279 | QETH_CARD_TEXT(card, 4, "clearip"); |
280 | 280 | ||
281 | if (recover && card->options.sniffer) | ||
282 | return; | ||
283 | |||
284 | spin_lock_bh(&card->ip_lock); | 281 | spin_lock_bh(&card->ip_lock); |
285 | 282 | ||
286 | hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { | 283 | hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { |
@@ -494,9 +491,8 @@ int qeth_l3_setrouting_v4(struct qeth_card *card) | |||
494 | QETH_PROT_IPV4); | 491 | QETH_PROT_IPV4); |
495 | if (rc) { | 492 | if (rc) { |
496 | card->options.route4.type = NO_ROUTER; | 493 | card->options.route4.type = NO_ROUTER; |
497 | QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" | 494 | QETH_DBF_MESSAGE(2, "Error (%#06x) while setting routing type on device %x. Type set to 'no router'.\n", |
498 | " on %s. Type set to 'no router'.\n", rc, | 495 | rc, CARD_DEVID(card)); |
499 | QETH_CARD_IFNAME(card)); | ||
500 | } | 496 | } |
501 | return rc; | 497 | return rc; |
502 | } | 498 | } |
@@ -518,9 +514,8 @@ int qeth_l3_setrouting_v6(struct qeth_card *card) | |||
518 | QETH_PROT_IPV6); | 514 | QETH_PROT_IPV6); |
519 | if (rc) { | 515 | if (rc) { |
520 | card->options.route6.type = NO_ROUTER; | 516 | card->options.route6.type = NO_ROUTER; |
521 | QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" | 517 | QETH_DBF_MESSAGE(2, "Error (%#06x) while setting routing type on device %x. Type set to 'no router'.\n", |
522 | " on %s. Type set to 'no router'.\n", rc, | 518 | rc, CARD_DEVID(card)); |
523 | QETH_CARD_IFNAME(card)); | ||
524 | } | 519 | } |
525 | return rc; | 520 | return rc; |
526 | } | 521 | } |
@@ -663,6 +658,8 @@ static int qeth_l3_register_addr_entry(struct qeth_card *card, | |||
663 | int rc = 0; | 658 | int rc = 0; |
664 | int cnt = 3; | 659 | int cnt = 3; |
665 | 660 | ||
661 | if (card->options.sniffer) | ||
662 | return 0; | ||
666 | 663 | ||
667 | if (addr->proto == QETH_PROT_IPV4) { | 664 | if (addr->proto == QETH_PROT_IPV4) { |
668 | QETH_CARD_TEXT(card, 2, "setaddr4"); | 665 | QETH_CARD_TEXT(card, 2, "setaddr4"); |
@@ -697,6 +694,9 @@ static int qeth_l3_deregister_addr_entry(struct qeth_card *card, | |||
697 | { | 694 | { |
698 | int rc = 0; | 695 | int rc = 0; |
699 | 696 | ||
697 | if (card->options.sniffer) | ||
698 | return 0; | ||
699 | |||
700 | if (addr->proto == QETH_PROT_IPV4) { | 700 | if (addr->proto == QETH_PROT_IPV4) { |
701 | QETH_CARD_TEXT(card, 2, "deladdr4"); | 701 | QETH_CARD_TEXT(card, 2, "deladdr4"); |
702 | QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); | 702 | QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); |
@@ -1070,8 +1070,8 @@ qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply, | |||
1070 | } | 1070 | } |
1071 | break; | 1071 | break; |
1072 | default: | 1072 | default: |
1073 | QETH_DBF_MESSAGE(2, "Unknown sniffer action (0x%04x) on %s\n", | 1073 | QETH_DBF_MESSAGE(2, "Unknown sniffer action (%#06x) on device %x\n", |
1074 | cmd->data.diagass.action, QETH_CARD_IFNAME(card)); | 1074 | cmd->data.diagass.action, CARD_DEVID(card)); |
1075 | } | 1075 | } |
1076 | 1076 | ||
1077 | return 0; | 1077 | return 0; |
@@ -1517,32 +1517,25 @@ static void qeth_l3_set_rx_mode(struct net_device *dev) | |||
1517 | qeth_l3_handle_promisc_mode(card); | 1517 | qeth_l3_handle_promisc_mode(card); |
1518 | } | 1518 | } |
1519 | 1519 | ||
1520 | static const char *qeth_l3_arp_get_error_cause(int *rc) | 1520 | static int qeth_l3_arp_makerc(int rc) |
1521 | { | 1521 | { |
1522 | switch (*rc) { | 1522 | switch (rc) { |
1523 | case QETH_IPA_ARP_RC_FAILED: | 1523 | case IPA_RC_SUCCESS: |
1524 | *rc = -EIO; | 1524 | return 0; |
1525 | return "operation failed"; | ||
1526 | case QETH_IPA_ARP_RC_NOTSUPP: | 1525 | case QETH_IPA_ARP_RC_NOTSUPP: |
1527 | *rc = -EOPNOTSUPP; | ||
1528 | return "operation not supported"; | ||
1529 | case QETH_IPA_ARP_RC_OUT_OF_RANGE: | ||
1530 | *rc = -EINVAL; | ||
1531 | return "argument out of range"; | ||
1532 | case QETH_IPA_ARP_RC_Q_NOTSUPP: | 1526 | case QETH_IPA_ARP_RC_Q_NOTSUPP: |
1533 | *rc = -EOPNOTSUPP; | 1527 | return -EOPNOTSUPP; |
1534 | return "query operation not supported"; | 1528 | case QETH_IPA_ARP_RC_OUT_OF_RANGE: |
1529 | return -EINVAL; | ||
1535 | case QETH_IPA_ARP_RC_Q_NO_DATA: | 1530 | case QETH_IPA_ARP_RC_Q_NO_DATA: |
1536 | *rc = -ENOENT; | 1531 | return -ENOENT; |
1537 | return "no query data available"; | ||
1538 | default: | 1532 | default: |
1539 | return "unknown error"; | 1533 | return -EIO; |
1540 | } | 1534 | } |
1541 | } | 1535 | } |
1542 | 1536 | ||
1543 | static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) | 1537 | static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) |
1544 | { | 1538 | { |
1545 | int tmp; | ||
1546 | int rc; | 1539 | int rc; |
1547 | 1540 | ||
1548 | QETH_CARD_TEXT(card, 3, "arpstnoe"); | 1541 | QETH_CARD_TEXT(card, 3, "arpstnoe"); |
@@ -1560,13 +1553,10 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) | |||
1560 | rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, | 1553 | rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, |
1561 | IPA_CMD_ASS_ARP_SET_NO_ENTRIES, | 1554 | IPA_CMD_ASS_ARP_SET_NO_ENTRIES, |
1562 | no_entries); | 1555 | no_entries); |
1563 | if (rc) { | 1556 | if (rc) |
1564 | tmp = rc; | 1557 | QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on device %x: %#x\n", |
1565 | QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on " | 1558 | CARD_DEVID(card), rc); |
1566 | "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), | 1559 | return qeth_l3_arp_makerc(rc); |
1567 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
1568 | } | ||
1569 | return rc; | ||
1570 | } | 1560 | } |
1571 | 1561 | ||
1572 | static __u32 get_arp_entry_size(struct qeth_card *card, | 1562 | static __u32 get_arp_entry_size(struct qeth_card *card, |
@@ -1716,7 +1706,6 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card, | |||
1716 | { | 1706 | { |
1717 | struct qeth_cmd_buffer *iob; | 1707 | struct qeth_cmd_buffer *iob; |
1718 | struct qeth_ipa_cmd *cmd; | 1708 | struct qeth_ipa_cmd *cmd; |
1719 | int tmp; | ||
1720 | int rc; | 1709 | int rc; |
1721 | 1710 | ||
1722 | QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); | 1711 | QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); |
@@ -1735,15 +1724,10 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card, | |||
1735 | rc = qeth_l3_send_ipa_arp_cmd(card, iob, | 1724 | rc = qeth_l3_send_ipa_arp_cmd(card, iob, |
1736 | QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN, | 1725 | QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN, |
1737 | qeth_l3_arp_query_cb, (void *)qinfo); | 1726 | qeth_l3_arp_query_cb, (void *)qinfo); |
1738 | if (rc) { | 1727 | if (rc) |
1739 | tmp = rc; | 1728 | QETH_DBF_MESSAGE(2, "Error while querying ARP cache on device %x: %#x\n", |
1740 | QETH_DBF_MESSAGE(2, | 1729 | CARD_DEVID(card), rc); |
1741 | "Error while querying ARP cache on %s: %s " | 1730 | return qeth_l3_arp_makerc(rc); |
1742 | "(0x%x/%d)\n", QETH_CARD_IFNAME(card), | ||
1743 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
1744 | } | ||
1745 | |||
1746 | return rc; | ||
1747 | } | 1731 | } |
1748 | 1732 | ||
1749 | static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) | 1733 | static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) |
@@ -1793,15 +1777,18 @@ out: | |||
1793 | return rc; | 1777 | return rc; |
1794 | } | 1778 | } |
1795 | 1779 | ||
1796 | static int qeth_l3_arp_add_entry(struct qeth_card *card, | 1780 | static int qeth_l3_arp_modify_entry(struct qeth_card *card, |
1797 | struct qeth_arp_cache_entry *entry) | 1781 | struct qeth_arp_cache_entry *entry, |
1782 | enum qeth_arp_process_subcmds arp_cmd) | ||
1798 | { | 1783 | { |
1784 | struct qeth_arp_cache_entry *cmd_entry; | ||
1799 | struct qeth_cmd_buffer *iob; | 1785 | struct qeth_cmd_buffer *iob; |
1800 | char buf[16]; | ||
1801 | int tmp; | ||
1802 | int rc; | 1786 | int rc; |
1803 | 1787 | ||
1804 | QETH_CARD_TEXT(card, 3, "arpadent"); | 1788 | if (arp_cmd == IPA_CMD_ASS_ARP_ADD_ENTRY) |
1789 | QETH_CARD_TEXT(card, 3, "arpadd"); | ||
1790 | else | ||
1791 | QETH_CARD_TEXT(card, 3, "arpdel"); | ||
1805 | 1792 | ||
1806 | /* | 1793 | /* |
1807 | * currently GuestLAN only supports the ARP assist function | 1794 | * currently GuestLAN only supports the ARP assist function |
@@ -1814,71 +1801,25 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card, | |||
1814 | return -EOPNOTSUPP; | 1801 | return -EOPNOTSUPP; |
1815 | } | 1802 | } |
1816 | 1803 | ||
1817 | iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, | 1804 | iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, arp_cmd, |
1818 | IPA_CMD_ASS_ARP_ADD_ENTRY, | 1805 | sizeof(*cmd_entry), QETH_PROT_IPV4); |
1819 | sizeof(struct qeth_arp_cache_entry), | ||
1820 | QETH_PROT_IPV4); | ||
1821 | if (!iob) | 1806 | if (!iob) |
1822 | return -ENOMEM; | 1807 | return -ENOMEM; |
1823 | rc = qeth_send_setassparms(card, iob, | ||
1824 | sizeof(struct qeth_arp_cache_entry), | ||
1825 | (unsigned long) entry, | ||
1826 | qeth_setassparms_cb, NULL); | ||
1827 | if (rc) { | ||
1828 | tmp = rc; | ||
1829 | qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); | ||
1830 | QETH_DBF_MESSAGE(2, "Could not add ARP entry for address %s " | ||
1831 | "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), | ||
1832 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
1833 | } | ||
1834 | return rc; | ||
1835 | } | ||
1836 | |||
1837 | static int qeth_l3_arp_remove_entry(struct qeth_card *card, | ||
1838 | struct qeth_arp_cache_entry *entry) | ||
1839 | { | ||
1840 | struct qeth_cmd_buffer *iob; | ||
1841 | char buf[16] = {0, }; | ||
1842 | int tmp; | ||
1843 | int rc; | ||
1844 | 1808 | ||
1845 | QETH_CARD_TEXT(card, 3, "arprment"); | 1809 | cmd_entry = &__ipa_cmd(iob)->data.setassparms.data.arp_entry; |
1810 | ether_addr_copy(cmd_entry->macaddr, entry->macaddr); | ||
1811 | memcpy(cmd_entry->ipaddr, entry->ipaddr, 4); | ||
1812 | rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_cb, NULL); | ||
1813 | if (rc) | ||
1814 | QETH_DBF_MESSAGE(2, "Could not modify (cmd: %#x) ARP entry on device %x: %#x\n", | ||
1815 | arp_cmd, CARD_DEVID(card), rc); | ||
1846 | 1816 | ||
1847 | /* | 1817 | return qeth_l3_arp_makerc(rc); |
1848 | * currently GuestLAN only supports the ARP assist function | ||
1849 | * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_REMOVE_ENTRY; | ||
1850 | * thus we say EOPNOTSUPP for this ARP function | ||
1851 | */ | ||
1852 | if (card->info.guestlan) | ||
1853 | return -EOPNOTSUPP; | ||
1854 | if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) { | ||
1855 | return -EOPNOTSUPP; | ||
1856 | } | ||
1857 | memcpy(buf, entry, 12); | ||
1858 | iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, | ||
1859 | IPA_CMD_ASS_ARP_REMOVE_ENTRY, | ||
1860 | 12, | ||
1861 | QETH_PROT_IPV4); | ||
1862 | if (!iob) | ||
1863 | return -ENOMEM; | ||
1864 | rc = qeth_send_setassparms(card, iob, | ||
1865 | 12, (unsigned long)buf, | ||
1866 | qeth_setassparms_cb, NULL); | ||
1867 | if (rc) { | ||
1868 | tmp = rc; | ||
1869 | memset(buf, 0, 16); | ||
1870 | qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf); | ||
1871 | QETH_DBF_MESSAGE(2, "Could not delete ARP entry for address %s" | ||
1872 | " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card), | ||
1873 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
1874 | } | ||
1875 | return rc; | ||
1876 | } | 1818 | } |
1877 | 1819 | ||
1878 | static int qeth_l3_arp_flush_cache(struct qeth_card *card) | 1820 | static int qeth_l3_arp_flush_cache(struct qeth_card *card) |
1879 | { | 1821 | { |
1880 | int rc; | 1822 | int rc; |
1881 | int tmp; | ||
1882 | 1823 | ||
1883 | QETH_CARD_TEXT(card, 3, "arpflush"); | 1824 | QETH_CARD_TEXT(card, 3, "arpflush"); |
1884 | 1825 | ||
@@ -1894,19 +1835,17 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card) | |||
1894 | } | 1835 | } |
1895 | rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, | 1836 | rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, |
1896 | IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); | 1837 | IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); |
1897 | if (rc) { | 1838 | if (rc) |
1898 | tmp = rc; | 1839 | QETH_DBF_MESSAGE(2, "Could not flush ARP cache on device %x: %#x\n", |
1899 | QETH_DBF_MESSAGE(2, "Could not flush ARP cache on %s: %s " | 1840 | CARD_DEVID(card), rc); |
1900 | "(0x%x/%d)\n", QETH_CARD_IFNAME(card), | 1841 | return qeth_l3_arp_makerc(rc); |
1901 | qeth_l3_arp_get_error_cause(&rc), tmp, tmp); | ||
1902 | } | ||
1903 | return rc; | ||
1904 | } | 1842 | } |
1905 | 1843 | ||
1906 | static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 1844 | static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
1907 | { | 1845 | { |
1908 | struct qeth_card *card = dev->ml_priv; | 1846 | struct qeth_card *card = dev->ml_priv; |
1909 | struct qeth_arp_cache_entry arp_entry; | 1847 | struct qeth_arp_cache_entry arp_entry; |
1848 | enum qeth_arp_process_subcmds arp_cmd; | ||
1910 | int rc = 0; | 1849 | int rc = 0; |
1911 | 1850 | ||
1912 | switch (cmd) { | 1851 | switch (cmd) { |
@@ -1925,27 +1864,16 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
1925 | rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); | 1864 | rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); |
1926 | break; | 1865 | break; |
1927 | case SIOC_QETH_ARP_ADD_ENTRY: | 1866 | case SIOC_QETH_ARP_ADD_ENTRY: |
1928 | if (!capable(CAP_NET_ADMIN)) { | ||
1929 | rc = -EPERM; | ||
1930 | break; | ||
1931 | } | ||
1932 | if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data, | ||
1933 | sizeof(struct qeth_arp_cache_entry))) | ||
1934 | rc = -EFAULT; | ||
1935 | else | ||
1936 | rc = qeth_l3_arp_add_entry(card, &arp_entry); | ||
1937 | break; | ||
1938 | case SIOC_QETH_ARP_REMOVE_ENTRY: | 1867 | case SIOC_QETH_ARP_REMOVE_ENTRY: |
1939 | if (!capable(CAP_NET_ADMIN)) { | 1868 | if (!capable(CAP_NET_ADMIN)) |
1940 | rc = -EPERM; | 1869 | return -EPERM; |
1941 | break; | 1870 | if (copy_from_user(&arp_entry, rq->ifr_data, sizeof(arp_entry))) |
1942 | } | 1871 | return -EFAULT; |
1943 | if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data, | 1872 | |
1944 | sizeof(struct qeth_arp_cache_entry))) | 1873 | arp_cmd = (cmd == SIOC_QETH_ARP_ADD_ENTRY) ? |
1945 | rc = -EFAULT; | 1874 | IPA_CMD_ASS_ARP_ADD_ENTRY : |
1946 | else | 1875 | IPA_CMD_ASS_ARP_REMOVE_ENTRY; |
1947 | rc = qeth_l3_arp_remove_entry(card, &arp_entry); | 1876 | return qeth_l3_arp_modify_entry(card, &arp_entry, arp_cmd); |
1948 | break; | ||
1949 | case SIOC_QETH_ARP_FLUSH_CACHE: | 1877 | case SIOC_QETH_ARP_FLUSH_CACHE: |
1950 | if (!capable(CAP_NET_ADMIN)) { | 1878 | if (!capable(CAP_NET_ADMIN)) { |
1951 | rc = -EPERM; | 1879 | rc = -EPERM; |
@@ -2383,12 +2311,12 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = { | |||
2383 | .ndo_neigh_setup = qeth_l3_neigh_setup, | 2311 | .ndo_neigh_setup = qeth_l3_neigh_setup, |
2384 | }; | 2312 | }; |
2385 | 2313 | ||
2386 | static int qeth_l3_setup_netdev(struct qeth_card *card) | 2314 | static int qeth_l3_setup_netdev(struct qeth_card *card, bool carrier_ok) |
2387 | { | 2315 | { |
2388 | unsigned int headroom; | 2316 | unsigned int headroom; |
2389 | int rc; | 2317 | int rc; |
2390 | 2318 | ||
2391 | if (card->dev->netdev_ops) | 2319 | if (qeth_netdev_is_registered(card->dev)) |
2392 | return 0; | 2320 | return 0; |
2393 | 2321 | ||
2394 | if (card->info.type == QETH_CARD_TYPE_OSD || | 2322 | if (card->info.type == QETH_CARD_TYPE_OSD || |
@@ -2457,6 +2385,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card) | |||
2457 | 2385 | ||
2458 | netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); | 2386 | netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); |
2459 | rc = register_netdev(card->dev); | 2387 | rc = register_netdev(card->dev); |
2388 | if (!rc && carrier_ok) | ||
2389 | netif_carrier_on(card->dev); | ||
2390 | |||
2460 | out: | 2391 | out: |
2461 | if (rc) | 2392 | if (rc) |
2462 | card->dev->netdev_ops = NULL; | 2393 | card->dev->netdev_ops = NULL; |
@@ -2497,7 +2428,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev) | |||
2497 | if (cgdev->state == CCWGROUP_ONLINE) | 2428 | if (cgdev->state == CCWGROUP_ONLINE) |
2498 | qeth_l3_set_offline(cgdev); | 2429 | qeth_l3_set_offline(cgdev); |
2499 | 2430 | ||
2500 | unregister_netdev(card->dev); | 2431 | if (qeth_netdev_is_registered(card->dev)) |
2432 | unregister_netdev(card->dev); | ||
2501 | qeth_l3_clear_ip_htable(card, 0); | 2433 | qeth_l3_clear_ip_htable(card, 0); |
2502 | qeth_l3_clear_ipato_list(card); | 2434 | qeth_l3_clear_ipato_list(card); |
2503 | } | 2435 | } |
@@ -2507,6 +2439,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
2507 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); | 2439 | struct qeth_card *card = dev_get_drvdata(&gdev->dev); |
2508 | int rc = 0; | 2440 | int rc = 0; |
2509 | enum qeth_card_states recover_flag; | 2441 | enum qeth_card_states recover_flag; |
2442 | bool carrier_ok; | ||
2510 | 2443 | ||
2511 | mutex_lock(&card->discipline_mutex); | 2444 | mutex_lock(&card->discipline_mutex); |
2512 | mutex_lock(&card->conf_mutex); | 2445 | mutex_lock(&card->conf_mutex); |
@@ -2514,14 +2447,14 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
2514 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 2447 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
2515 | 2448 | ||
2516 | recover_flag = card->state; | 2449 | recover_flag = card->state; |
2517 | rc = qeth_core_hardsetup_card(card); | 2450 | rc = qeth_core_hardsetup_card(card, &carrier_ok); |
2518 | if (rc) { | 2451 | if (rc) { |
2519 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); | 2452 | QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); |
2520 | rc = -ENODEV; | 2453 | rc = -ENODEV; |
2521 | goto out_remove; | 2454 | goto out_remove; |
2522 | } | 2455 | } |
2523 | 2456 | ||
2524 | rc = qeth_l3_setup_netdev(card); | 2457 | rc = qeth_l3_setup_netdev(card, carrier_ok); |
2525 | if (rc) | 2458 | if (rc) |
2526 | goto out_remove; | 2459 | goto out_remove; |
2527 | 2460 | ||