qeth_sys.c

来自「linux 内核源代码」· C语言 代码 · 共 1,859 行 · 第 1/4 页

C
1,859
字号
	return sprintf(buf, "%i\n", card->options.add_hhlen);}static ssize_tqeth_dev_add_hhlen_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	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 < 0) || (i > MAX_ADD_HHLEN)) {		PRINT_WARN("add_hhlen out of range\n");		return -EINVAL;	}	card->options.add_hhlen = i;	return count;}static DEVICE_ATTR(add_hhlen, 0644, qeth_dev_add_hhlen_show,		   qeth_dev_add_hhlen_store);static ssize_tqeth_dev_fake_ll_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return sprintf(buf, "%i\n", card->options.fake_ll? 1:0);}static ssize_tqeth_dev_fake_ll_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	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, 16);	if ((i != 0) && (i != 1)) {		PRINT_WARN("fake_ll: write 0 or 1 to this file!\n");		return -EINVAL;	}	card->options.fake_ll = i;	return count;}static DEVICE_ATTR(fake_ll, 0644, qeth_dev_fake_ll_show,		   qeth_dev_fake_ll_store);static ssize_tqeth_dev_fake_broadcast_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return sprintf(buf, "%i\n", card->options.fake_broadcast? 1:0);}static ssize_tqeth_dev_fake_broadcast_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	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, 16);	if ((i == 0) || (i == 1))		card->options.fake_broadcast = i;	else {		PRINT_WARN("fake_broadcast: write 0 or 1 to this file!\n");		return -EINVAL;	}	return count;}static DEVICE_ATTR(fake_broadcast, 0644, qeth_dev_fake_broadcast_show,		   qeth_dev_fake_broadcast_store);static ssize_tqeth_dev_recover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	char *tmp;	int i;	if (!card)		return -EINVAL;	if (card->state != CARD_STATE_UP)		return -EPERM;	i = simple_strtoul(buf, &tmp, 16);	if (i == 1)		qeth_schedule_recovery(card);	return count;}static DEVICE_ATTR(recover, 0200, NULL, qeth_dev_recover_store);static ssize_tqeth_dev_broadcast_mode_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR)))		return sprintf(buf, "n/a\n");	return sprintf(buf, "%s\n", (card->options.broadcast_mode ==				     QETH_TR_BROADCAST_ALLRINGS)?		       "all rings":"local");}static ssize_tqeth_dev_broadcast_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	char *tmp;	if (!card)		return -EINVAL;	if ((card->state != CARD_STATE_DOWN) &&	    (card->state != CARD_STATE_RECOVER))		return -EPERM;	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR))){		PRINT_WARN("Device is not a tokenring device!\n");		return -EINVAL;	}	tmp = strsep((char **) &buf, "\n");	if (!strcmp(tmp, "local")){		card->options.broadcast_mode = QETH_TR_BROADCAST_LOCAL;		return count;	} else if (!strcmp(tmp, "all_rings")) {		card->options.broadcast_mode = QETH_TR_BROADCAST_ALLRINGS;		return count;	} else {		PRINT_WARN("broadcast_mode: invalid mode %s!\n",			   tmp);		return -EINVAL;	}	return count;}static DEVICE_ATTR(broadcast_mode, 0644, qeth_dev_broadcast_mode_show,		   qeth_dev_broadcast_mode_store);static ssize_tqeth_dev_canonical_macaddr_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR)))		return sprintf(buf, "n/a\n");	return sprintf(buf, "%i\n", (card->options.macaddr_mode ==				     QETH_TR_MACADDR_CANONICAL)? 1:0);}static ssize_tqeth_dev_canonical_macaddr_store(struct device *dev, struct device_attribute *attr, const char *buf,				  size_t count){	struct qeth_card *card = dev->driver_data;	char *tmp;	int i;	if (!card)		return -EINVAL;	if ((card->state != CARD_STATE_DOWN) &&	    (card->state != CARD_STATE_RECOVER))		return -EPERM;	if (!((card->info.link_type == QETH_LINK_TYPE_HSTR) ||	      (card->info.link_type == QETH_LINK_TYPE_LANE_TR))){		PRINT_WARN("Device is not a tokenring device!\n");		return -EINVAL;	}	i = simple_strtoul(buf, &tmp, 16);	if ((i == 0) || (i == 1))		card->options.macaddr_mode = i?			QETH_TR_MACADDR_CANONICAL :			QETH_TR_MACADDR_NONCANONICAL;	else {		PRINT_WARN("canonical_macaddr: write 0 or 1 to this file!\n");		return -EINVAL;	}	return count;}static DEVICE_ATTR(canonical_macaddr, 0644, qeth_dev_canonical_macaddr_show,		   qeth_dev_canonical_macaddr_store);static ssize_tqeth_dev_layer2_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return sprintf(buf, "%i\n", card->options.layer2 ? 1:0);}static ssize_tqeth_dev_layer2_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	char *tmp;	int i;	if (!card)		return -EINVAL;	if (card->info.type == QETH_CARD_TYPE_IQD) {                PRINT_WARN("Layer2 on Hipersockets is not supported! \n");                return -EPERM;        }	if (((card->state != CARD_STATE_DOWN) &&	     (card->state != CARD_STATE_RECOVER)))		return -EPERM;	i = simple_strtoul(buf, &tmp, 16);	if ((i == 0) || (i == 1))		card->options.layer2 = i;	else {		PRINT_WARN("layer2: write 0 or 1 to this file!\n");		return -EINVAL;	}	return count;}static DEVICE_ATTR(layer2, 0644, qeth_dev_layer2_show,		   qeth_dev_layer2_store);static ssize_tqeth_dev_performance_stats_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	return sprintf(buf, "%i\n", card->options.performance_stats ? 1:0);}static ssize_tqeth_dev_performance_stats_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	char *tmp;	int i;	if (!card)		return -EINVAL;	i = simple_strtoul(buf, &tmp, 16);	if ((i == 0) || (i == 1)) {		if (i == card->options.performance_stats)			return count;		card->options.performance_stats = i;		if (i == 0)			memset(&card->perf_stats, 0,				sizeof(struct qeth_perf_stats));		card->perf_stats.initial_rx_packets = card->stats.rx_packets;		card->perf_stats.initial_tx_packets = card->stats.tx_packets;	} else {		PRINT_WARN("performance_stats: write 0 or 1 to this file!\n");		return -EINVAL;	}	return count;}static DEVICE_ATTR(performance_stats, 0644, qeth_dev_performance_stats_show,		   qeth_dev_performance_stats_store);static ssize_tqeth_dev_large_send_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	if (!card)		return -EINVAL;	switch (card->options.large_send) {	case QETH_LARGE_SEND_NO:		return sprintf(buf, "%s\n", "no");	case QETH_LARGE_SEND_EDDP:		return sprintf(buf, "%s\n", "EDDP");	case QETH_LARGE_SEND_TSO:		return sprintf(buf, "%s\n", "TSO");	default:		return sprintf(buf, "%s\n", "N/A");	}}static ssize_tqeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){	struct qeth_card *card = dev->driver_data;	enum qeth_large_send_types type;	int rc = 0;	char *tmp;	if (!card)		return -EINVAL;	tmp = strsep((char **) &buf, "\n");	if (!strcmp(tmp, "no")){		type = QETH_LARGE_SEND_NO;	} else if (!strcmp(tmp, "EDDP")) {		type = QETH_LARGE_SEND_EDDP;	} else if (!strcmp(tmp, "TSO")) {		type = QETH_LARGE_SEND_TSO;	} else {		PRINT_WARN("large_send: invalid mode %s!\n", tmp);		return -EINVAL;	}	if (card->options.large_send == type)		return count;	if ((rc = qeth_set_large_send(card, type)))		return rc;	return count;}static DEVICE_ATTR(large_send, 0644, qeth_dev_large_send_show,		   qeth_dev_large_send_store);static ssize_tqeth_dev_blkt_show(char *buf, struct qeth_card *card, int value ){	if (!card)		return -EINVAL;	return sprintf(buf, "%i\n", value);}static ssize_tqeth_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_tqeth_dev_blkt_total_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	return qeth_dev_blkt_show(buf, card, card->info.blkt.time_total);}static ssize_tqeth_dev_blkt_total_store(struct device *dev, struct device_attribute *attr, 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_tqeth_dev_blkt_inter_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	return qeth_dev_blkt_show(buf, card, card->info.blkt.inter_packet);}static ssize_tqeth_dev_blkt_inter_store(struct device *dev, struct device_attribute *attr, 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_tqeth_dev_blkt_inter_jumbo_show(struct device *dev, struct device_attribute *attr, char *buf){	struct qeth_card *card = dev->driver_data;	return qeth_dev_blkt_show(buf, card,				  card->info.blkt.inter_packet_jumbo);}static ssize_tqeth_dev_blkt_inter_jumbo_store(struct device *dev, struct device_attribute *attr, 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);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?