patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / s390 / net / qeth_sys.c
index 5a3c788..910c5f5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.24 $)
+ * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.32 $)
  *
  * Linux on zSeries OSA Express and HiperSockets support
  * This file contains code related to sysfs.
@@ -20,6 +20,8 @@
 #include "qeth_mpc.h"
 #include "qeth_fs.h"
 
+const char *VERSION_QETH_SYS_C = "$Revision: 1.32 $";
+
 /*****************************************************************************/
 /*                                                                           */
 /*          /sys-fs stuff UNDER DEVELOPMENT !!!                              */
@@ -320,7 +322,8 @@ static DEVICE_ATTR(buffer_count, 0644, qeth_dev_bufcnt_show,
                qeth_dev_bufcnt_store);
 
 static inline ssize_t
-qeth_dev_route_show(struct qeth_routing_info *route, char *buf)
+qeth_dev_route_show(struct qeth_card *card, struct qeth_routing_info *route,
+                   char *buf)
 {
        switch (route->type) {
        case PRIMARY_ROUTER:
@@ -328,11 +331,20 @@ qeth_dev_route_show(struct qeth_routing_info *route, char *buf)
        case SECONDARY_ROUTER:
                return sprintf(buf, "%s\n", "secondary router");
        case MULTICAST_ROUTER:
-               return sprintf(buf, "%s\n", "multicast router");
+               if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
+                       return sprintf(buf, "%s\n", "multicast router+");
+               else
+                       return sprintf(buf, "%s\n", "multicast router");
        case PRIMARY_CONNECTOR:
-               return sprintf(buf, "%s\n", "primary connector");
+               if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
+                       return sprintf(buf, "%s\n", "primary connector+");
+               else
+                       return sprintf(buf, "%s\n", "primary connector");
        case SECONDARY_CONNECTOR:
-               return sprintf(buf, "%s\n", "secondary connector");
+               if (card->info.broadcast_capable == QETH_BROADCAST_WITHOUT_ECHO)
+                       return sprintf(buf, "%s\n", "secondary connector+");
+               else
+                       return sprintf(buf, "%s\n", "secondary connector");
        default:
                return sprintf(buf, "%s\n", "no");
        }
@@ -346,7 +358,7 @@ qeth_dev_route4_show(struct device *dev, char *buf)
        if (!card)
                return -EINVAL;
 
-       return qeth_dev_route_show(&card->options.route4, buf);
+       return qeth_dev_route_show(card, &card->options.route4, buf);
 }
 
 static inline ssize_t
@@ -414,7 +426,7 @@ qeth_dev_route6_show(struct device *dev, char *buf)
        if (!qeth_is_supported(card, IPA_IPV6))
                return sprintf(buf, "%s\n", "n/a");
 
-       return qeth_dev_route_show(&card->options.route6, buf);
+       return qeth_dev_route_show(card, &card->options.route6, buf);
 }
 
 static ssize_t
@@ -737,6 +749,10 @@ qeth_dev_ipato_enable_store(struct device *dev, const char *buf, size_t count)
        if (!card)
                return -EINVAL;
 
+       if ((card->state != CARD_STATE_DOWN) &&
+           (card->state != CARD_STATE_RECOVER))
+               return -EPERM;
+
        tmp = strsep((char **) &buf, "\n");
        if (!strcmp(tmp, "toggle")){
                card->ipato.enabled = (card->ipato.enabled)? 0 : 1;
@@ -1426,22 +1442,33 @@ qeth_driver_group_store(struct device_driver *ddrv, const char *buf,
 static DRIVER_ATTR(group, 0200, 0, qeth_driver_group_store);
 
 static ssize_t
-qeth_driver_snmp_register_show(struct device_driver *ddrv, char *buf)
-{
-       /* TODO */
-       return 0;
-}
-
-static ssize_t
-qeth_driver_snmp_register_store(struct device_driver *ddrv, const char *buf,
+qeth_driver_notifier_register_store(struct device_driver *ddrv, const char *buf,
                                size_t count)
 {
-       /* TODO */
+       int rc;
+       int signum;
+       char *tmp, *tmp2;
+
+       tmp = strsep((char **) &buf, "\n");
+       if (!strncmp(tmp, "unregister", 10)){
+               if ((rc = qeth_notifier_unregister(current)))
+                       return rc;
+               return count;
+       }
+
+       signum = simple_strtoul(tmp, &tmp2, 10);
+       if ((signum < 0) || (signum > 32)){
+               PRINT_WARN("Signal number %d is out of range\n", signum);
+               return -EINVAL;
+       }
+       if ((rc = qeth_notifier_register(current, signum)))
+               return rc;
+
        return count;
 }
 
-static DRIVER_ATTR(snmp_register, 0644, qeth_driver_snmp_register_show,
-                  qeth_driver_snmp_register_store);
+static DRIVER_ATTR(notifier_register, 0200, 0,
+                  qeth_driver_notifier_register_store);
 
 int
 qeth_create_driver_attributes(void)
@@ -1452,7 +1479,7 @@ qeth_create_driver_attributes(void)
                                     &driver_attr_group)))
                return rc;
        return driver_create_file(&qeth_ccwgroup_driver.driver,
-                                 &driver_attr_snmp_register);
+                                 &driver_attr_notifier_register);
 }
 
 void
@@ -1461,5 +1488,5 @@ qeth_remove_driver_attributes(void)
        driver_remove_file(&qeth_ccwgroup_driver.driver,
                        &driver_attr_group);
        driver_remove_file(&qeth_ccwgroup_driver.driver,
-                       &driver_attr_snmp_register);
+                       &driver_attr_notifier_register);
 }