[patch 6/9] s390: qeth blkt tuning.

From: Steffen Thoss <[EMAIL PROTECTED]>

Add support for qeth BLKT tuning, the OSA inbound blocking or
packing algorithm.

Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]>

diffstat:
 drivers/s390/net/qeth.h      |    9 +++
 drivers/s390/net/qeth_main.c |   35 ++++++++----
 drivers/s390/net/qeth_sys.c  |  116 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 147 insertions(+), 13 deletions(-)

diff -urpN linux-2.6/drivers/s390/net/qeth.h 
linux-2.6-patched/drivers/s390/net/qeth.h
--- linux-2.6/drivers/s390/net/qeth.h   2005-03-24 14:03:04.000000000 +0100
+++ linux-2.6-patched/drivers/s390/net/qeth.h   2005-03-24 14:03:04.000000000 
+0100
@@ -668,6 +668,14 @@ struct qeth_reply {
 #define QETH_BROADCAST_WITH_ECHO    1
 #define QETH_BROADCAST_WITHOUT_ECHO 2
 
+struct qeth_card_blkt {
+       int time_total;
+       int inter_packet;
+       int inter_packet_jumbo;
+};
+
+
+
 struct qeth_card_info {
        unsigned short unit_addr2;
        unsigned short cula;
@@ -686,6 +694,7 @@ struct qeth_card_info {
        int max_mtu;
        int broadcast_capable;
        int unique_id;
+       struct qeth_card_blkt blkt;
        __u32 csum_mask;
 };
 
diff -urpN linux-2.6/drivers/s390/net/qeth_main.c 
linux-2.6-patched/drivers/s390/net/qeth_main.c
--- linux-2.6/drivers/s390/net/qeth_main.c      2005-03-24 14:03:04.000000000 
+0100
+++ linux-2.6-patched/drivers/s390/net/qeth_main.c      2005-03-24 
14:03:04.000000000 +0100
@@ -2868,17 +2868,9 @@ qeth_qdio_output_handler(struct ccw_devi
 #endif
 }
 
-static char*
-qeth_create_qib_param_field(struct qeth_card *card)
+static void
+qeth_create_qib_param_field(struct qeth_card *card, char *param_field)
 {
-       char *param_field;
-
-       param_field = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char),
-                             GFP_KERNEL);
-       if (!param_field)
-               return NULL;
-
-       memset(param_field, 0, QDIO_MAX_BUFFERS_PER_Q * sizeof(char));
 
        param_field[0] = _ascebc['P'];
        param_field[1] = _ascebc['C'];
@@ -2887,8 +2879,18 @@ qeth_create_qib_param_field(struct qeth_
        *((unsigned int *) (&param_field[4])) = QETH_PCI_THRESHOLD_A(card);
        *((unsigned int *) (&param_field[8])) = QETH_PCI_THRESHOLD_B(card);
        *((unsigned int *) (&param_field[12])) = QETH_PCI_TIMER_VALUE(card);
+}
 
-       return param_field;
+static void
+qeth_create_qib_param_field_blkt(struct qeth_card *card, char *param_field)
+{
+       param_field[16] = _ascebc['B'];
+        param_field[17] = _ascebc['L'];
+        param_field[18] = _ascebc['K'];
+        param_field[19] = _ascebc['T'];
+        *((unsigned int *) (&param_field[20])) = card->info.blkt.time_total;
+        *((unsigned int *) (&param_field[24])) = card->info.blkt.inter_packet;
+        *((unsigned int *) (&param_field[28])) = 
card->info.blkt.inter_packet_jumbo;
 }
 
 static void
@@ -3148,10 +3150,17 @@ qeth_qdio_establish(struct qeth_card *ca
        int rc;
 
        QETH_DBF_TEXT(setup, 2, "qdioest");
-       qib_param_field = qeth_create_qib_param_field(card);
-       if (!qib_param_field)
+
+       qib_param_field = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(char),
+                             GFP_KERNEL);
+       if (!qib_param_field)
                return -ENOMEM;
 
+       memset(qib_param_field, 0, QDIO_MAX_BUFFERS_PER_Q * sizeof(char));
+
+       qeth_create_qib_param_field(card, qib_param_field);
+       qeth_create_qib_param_field_blkt(card, qib_param_field);
+
        in_sbal_ptrs = kmalloc(QDIO_MAX_BUFFERS_PER_Q * sizeof(void *),
                               GFP_KERNEL);
        if (!in_sbal_ptrs) {
diff -urpN linux-2.6/drivers/s390/net/qeth_sys.c 
linux-2.6-patched/drivers/s390/net/qeth_sys.c
--- linux-2.6/drivers/s390/net/qeth_sys.c       2005-03-24 14:03:04.000000000 
+0100
+++ linux-2.6-patched/drivers/s390/net/qeth_sys.c       2005-03-24 
14:03:04.000000000 +0100
@@ -741,6 +741,119 @@ qeth_dev_layer2_store(struct device *dev
 static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,
                   qeth_dev_layer2_store);
 
+static ssize_t
+qeth_dev_blkt_show(char *buf, struct qeth_card *card, int value )
+{
+
+       if (!card)
+               return -EINVAL;
+
+       return sprintf(buf, "%i\n", value);
+}
+
+static ssize_t
+qeth_dev_blkt_store(struct qeth_card *card, const char *buf, size_t count,
+                         int *value, int max_value)
+{
+       char *tmp;
+       int i;
+
+       if (!card)
+               return -EINVAL;
+
+       if ((card->state != CARD_STATE_DOWN) &&
+           (card->state != CARD_STATE_RECOVER))
+               return -EPERM;
+
+       i = simple_strtoul(buf, &tmp, 10);
+       if (i <= max_value) {
+               *value = i;
+       } else {
+               PRINT_WARN("blkt total time: write values between"
+                          " 0 and %d to this file!\n", max_value);
+               return -EINVAL;
+       }
+       return count;
+}
+
+static ssize_t
+qeth_dev_blkt_total_show(struct device *dev, char *buf)
+{
+       struct qeth_card *card = dev->driver_data;
+
+       return qeth_dev_blkt_show(buf, card, card->info.blkt.time_total);
+}
+
+
+static ssize_t
+qeth_dev_blkt_total_store(struct device *dev, const char *buf, size_t count)
+{
+       struct qeth_card *card = dev->driver_data;
+
+       return qeth_dev_blkt_store(card, buf, count,
+                                  &card->info.blkt.time_total,1000);
+}
+
+
+
+static DEVICE_ATTR(total, 0644, qeth_dev_blkt_total_show,
+                  qeth_dev_blkt_total_store);
+
+static ssize_t
+qeth_dev_blkt_inter_show(struct device *dev, char *buf)
+{
+       struct qeth_card *card = dev->driver_data;
+
+       return qeth_dev_blkt_show(buf, card, card->info.blkt.inter_packet);
+}
+
+
+static ssize_t
+qeth_dev_blkt_inter_store(struct device *dev, const char *buf, size_t count)
+{
+       struct qeth_card *card = dev->driver_data;
+
+       return qeth_dev_blkt_store(card, buf, count,
+                                  &card->info.blkt.inter_packet,100);
+}
+
+static DEVICE_ATTR(inter, 0644, qeth_dev_blkt_inter_show,
+                  qeth_dev_blkt_inter_store);
+
+static ssize_t
+qeth_dev_blkt_inter_jumbo_show(struct device *dev, char *buf)
+{
+       struct qeth_card *card = dev->driver_data;
+
+       return qeth_dev_blkt_show(buf, card,
+                                 card->info.blkt.inter_packet_jumbo);
+}
+
+
+static ssize_t
+qeth_dev_blkt_inter_jumbo_store(struct device *dev, const char *buf, size_t 
count)
+{
+       struct qeth_card *card = dev->driver_data;
+
+       return qeth_dev_blkt_store(card, buf, count,
+                                  &card->info.blkt.inter_packet_jumbo,100);
+}
+
+static DEVICE_ATTR(inter_jumbo, 0644, qeth_dev_blkt_inter_jumbo_show,
+                  qeth_dev_blkt_inter_jumbo_store);
+
+static struct device_attribute * qeth_blkt_device_attrs[] = {
+       &dev_attr_total,
+       &dev_attr_inter,
+       &dev_attr_inter_jumbo,
+       NULL,
+};
+
+static struct attribute_group qeth_device_blkt_group = {
+       .name = "blkt",
+       .attrs = (struct attribute **)qeth_blkt_device_attrs,
+};
+
 static struct device_attribute * qeth_device_attrs[] = {
        &dev_attr_state,
        &dev_attr_chpid,
@@ -1516,6 +1629,8 @@ qeth_create_device_attributes(struct dev
                sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
                sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
        }
+       if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_blkt_group)))
+               return ret;
 
        return ret;
 }
@@ -1527,6 +1642,7 @@ qeth_remove_device_attributes(struct dev
        sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
        sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
        sysfs_remove_group(&dev->kobj, &qeth_device_rxip_group);
+       sysfs_remove_group(&dev->kobj, &qeth_device_blkt_group);
 }
 
 /**********************/
-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to