From: Steffen Thoss Add support for qeth BLKT tuning, the OSA inbound blocking or packing algorithm. Signed-off-by: Martin Schwidefsky Signed-off-by: Andrew Morton --- 25-akpm/drivers/s390/net/qeth.h | 9 ++ 25-akpm/drivers/s390/net/qeth_main.c | 35 ++++++---- 25-akpm/drivers/s390/net/qeth_sys.c | 116 +++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 13 deletions(-) diff -puN drivers/s390/net/qeth.h~s390-qeth-blkt-tuning drivers/s390/net/qeth.h --- 25/drivers/s390/net/qeth.h~s390-qeth-blkt-tuning Thu Mar 24 15:29:04 2005 +++ 25-akpm/drivers/s390/net/qeth.h Thu Mar 24 15:29:04 2005 @@ -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 -puN drivers/s390/net/qeth_main.c~s390-qeth-blkt-tuning drivers/s390/net/qeth_main.c --- 25/drivers/s390/net/qeth_main.c~s390-qeth-blkt-tuning Thu Mar 24 15:29:04 2005 +++ 25-akpm/drivers/s390/net/qeth_main.c Thu Mar 24 15:29:04 2005 @@ -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 -puN drivers/s390/net/qeth_sys.c~s390-qeth-blkt-tuning drivers/s390/net/qeth_sys.c --- 25/drivers/s390/net/qeth_sys.c~s390-qeth-blkt-tuning Thu Mar 24 15:29:04 2005 +++ 25-akpm/drivers/s390/net/qeth_sys.c Thu Mar 24 15:29:04 2005 @@ -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); } /**********************/ _