qeth: IP address takeover flag setting
authorKlaus-Dieter Wacker <kdwacker@de.ibmc.om>
Thu, 22 Jul 2010 23:15:03 +0000 (23:15 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Jul 2010 19:36:22 +0000 (12:36 -0700)
The qeth IP address flag setting is possible when device is
offline. When setting device online afterwards the current set
IP addresses have to be correctly registered with the device
regarding the IP address takeover attribute.

Signed-off-by: Klaus-Dieter Wacker <kdwacker@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_l3.h
drivers/s390/net/qeth_l3_main.c
drivers/s390/net/qeth_l3_sys.c

index d79892782a2b2cf1ef5b9a25eb281d87c6cbff47..e7e99e6cad2162c2ce2018356faac4927c2aeb8f 100644 (file)
@@ -188,8 +188,7 @@ static inline int qeth_is_ipa_enabled(struct qeth_ipa_info *ipa,
                qeth_is_enabled6(c, f) : qeth_is_enabled(c, f))
 
 #define QETH_IDX_FUNC_LEVEL_OSD                 0x0101
-#define QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT 0x4108
-#define QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT 0x5108
+#define QETH_IDX_FUNC_LEVEL_IQD                 0x4108
 
 #define QETH_MODELLIST_ARRAY \
        {{0x1731, 0x01, 0x1732, QETH_CARD_TYPE_OSD, QETH_MAX_QUEUES, 0}, \
index b7019066c303af489d9cd4cfe52dcb50976b9dd4..844935fbe6a8368702e633f11382cbe5804e663c 100644 (file)
@@ -1383,12 +1383,7 @@ static void qeth_init_func_level(struct qeth_card *card)
 {
        switch (card->info.type) {
        case QETH_CARD_TYPE_IQD:
-               if (card->ipato.enabled)
-                       card->info.func_level =
-                               QETH_IDX_FUNC_LEVEL_IQD_ENA_IPAT;
-               else
-                       card->info.func_level =
-                               QETH_IDX_FUNC_LEVEL_IQD_DIS_IPAT;
+               card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD;
                break;
        case QETH_CARD_TYPE_OSD:
        case QETH_CARD_TYPE_OSN:
index 8447d233d0b33e97ef9e82511cecd1e08119a02f..e705b27ec7dc133c7920f6a50d7a71a2a2204ca2 100644 (file)
@@ -64,5 +64,6 @@ void qeth_l3_del_rxip(struct qeth_card *card, enum qeth_prot_versions,
                        const u8 *);
 int qeth_l3_set_large_send(struct qeth_card *, enum qeth_large_send_types);
 int qeth_l3_set_rx_csum(struct qeth_card *, enum qeth_checksum_types);
+int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *, struct qeth_ipaddr *);
 
 #endif /* __QETH_L3_H__ */
index 61d348e51920a584add110bc23f39fee954836b6..15b5ca82bd26d385f092ae7696f4e97813965894 100644 (file)
@@ -195,7 +195,7 @@ static void qeth_l3_convert_addr_to_bits(u8 *addr, u8 *bits, int len)
        }
 }
 
-static int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *card,
+int qeth_l3_is_addr_covered_by_ipato(struct qeth_card *card,
                                                struct qeth_ipaddr *addr)
 {
        struct qeth_ipato_entry *ipatoe;
index fb5318b30e99bfe849602fa127bbf1a1ffe83336..67cfa68dcf1b9781f45314521f357380a5a6568c 100644 (file)
@@ -479,6 +479,7 @@ static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t count)
 {
        struct qeth_card *card = dev_get_drvdata(dev);
+       struct qeth_ipaddr *tmpipa, *t;
        char *tmp;
        int rc = 0;
 
@@ -497,8 +498,21 @@ static ssize_t qeth_l3_dev_ipato_enable_store(struct device *dev,
                card->ipato.enabled = (card->ipato.enabled)? 0 : 1;
        } else if (!strcmp(tmp, "1")) {
                card->ipato.enabled = 1;
+               list_for_each_entry_safe(tmpipa, t, card->ip_tbd_list, entry) {
+                       if ((tmpipa->type == QETH_IP_TYPE_NORMAL) &&
+                               qeth_l3_is_addr_covered_by_ipato(card, tmpipa))
+                               tmpipa->set_flags |=
+                                       QETH_IPA_SETIP_TAKEOVER_FLAG;
+               }
+
        } else if (!strcmp(tmp, "0")) {
                card->ipato.enabled = 0;
+               list_for_each_entry_safe(tmpipa, t, card->ip_tbd_list, entry) {
+                       if (tmpipa->set_flags &
+                               QETH_IPA_SETIP_TAKEOVER_FLAG)
+                               tmpipa->set_flags &=
+                                       ~QETH_IPA_SETIP_TAKEOVER_FLAG;
+               }
        } else
                rc = -EINVAL;
 out: