/* 
 * Copyright (C) 1996, 1997 Claus-Justus Heine.

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; see the file COPYING.  If not, write to
 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

 *
 * $Source: /homes/cvs/ftape-stacked/ftape/lowlevel/ftape-setup.c,v $
 * $Revision: 1.7 $
 * $Date: 1997/10/10 09:57:06 $
 *
 *      This file contains the code for processing the kernel command
 *      line options for the QIC-40/80/3010/3020 floppy-tape driver
 *      "ftape" for Linux.
 */

#include <linux/string.h>
#include <linux/errno.h>
#include <linux/mm.h>

#include <linux/ftape.h>
#include <linux/init.h>
#include "../lowlevel/ftape-tracing.h"
#include "../lowlevel/fdc-io.h"

static struct param_table {
	const char *name;
	int *var;
	int def_param;
	int min;
	int max;
} config_params[] __initdata = {
#ifndef CONFIG_FT_NO_TRACE_AT_ALL
	{ "tracing",   &ftape_tracing,     3,              ft_t_bug, ft_t_any},
#endif
	{ "ioport",    &ft_fdc_base,       CONFIG_FT_FDC_BASE,     0x0, 0xfff},
	{ "irq",       &ft_fdc_irq,        CONFIG_FT_FDC_IRQ,        2,    15},
	{ "dma",       &ft_fdc_dma,        CONFIG_FT_FDC_DMA,        0,     3},
	{ "threshold", &ft_fdc_threshold,  CONFIG_FT_FDC_THR,         1,    16},
	{ "datarate",  &ft_fdc_rate_limit, CONFIG_FT_FDC_MAX_RATE, 500,  2000},
	{ "fc10",      &ft_probe_fc10,     CONFIG_FT_PROBE_FC10,     0,     1},
	{ "mach2",     &ft_mach2,          CONFIG_FT_MACH2,          0,     1}
};

static int __init ftape_setup(char *str)
{
	int i;
	int param;
	int ints[2];

	TRACE_FUN(ft_t_flow);

	str = get_options(str, ARRAY_SIZE(ints), ints);
	if (str) {
		for (i=0; i < NR_ITEMS(config_params); i++) {
			if (strcmp(str,config_params[i].name) == 0){
				if (ints[0]) {
					param = ints[1];
				} else {
					param = config_params[i].def_param;
				}
				if (param < config_params[i].min ||
				    param > config_params[i].max) {
					TRACE(ft_t_err,
					"parameter %s out of range %d ... %d",
					      config_params[i].name,
					      config_params[i].min,
					      config_params[i].max);
					goto out;
				}
				if(config_params[i].var) {
					TRACE(ft_t_info, "%s=%d", str, param);
					*config_params[i].var = param;
				}
				goto out;
			}
		}
	}
	if (str) {
		TRACE(ft_t_err, "unknown ftape option [%s]", str);
		
		TRACE(ft_t_err, "allowed options are:");
		for (i=0; i < NR_ITEMS(config_params); i++) {
			TRACE(ft_t_err, " %s",config_params[i].name);
		}
	} else {
		TRACE(ft_t_err, "botched ftape option");
	}
 out:
	TRACE_EXIT 1;
}

__setup("ftape=", ftape_setup);
