[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 *) (¶m_field[4])) = QETH_PCI_THRESHOLD_A(card);
*((unsigned int *) (¶m_field[8])) = QETH_PCI_THRESHOLD_B(card);
*((unsigned int *) (¶m_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 *) (¶m_field[20])) = card->info.blkt.time_total;
+ *((unsigned int *) (¶m_field[24])) = card->info.blkt.inter_packet;
+ *((unsigned int *) (¶m_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