Commit dfb4b108 authored by Justin T. Gibbs's avatar Justin T. Gibbs

AICLIB Update

 o Add aic_parse_brace_option() which handles command line options
   of the format ":{...{..{}}".  This is used to factor out recurring
   code in both the aic7xxx and aic79xx drivers.
parent 518554b6
...@@ -1333,3 +1333,81 @@ aic_error_action(struct scsi_cmnd *cmd, struct scsi_inquiry_data *inq_data, ...@@ -1333,3 +1333,81 @@ aic_error_action(struct scsi_cmnd *cmd, struct scsi_inquiry_data *inq_data,
return (err_action); return (err_action);
} }
char *
aic_parse_brace_option(char *opt_name, char *opt_arg, char *end, int depth,
aic_option_callback_t *callback, void *callback_arg)
{
char *tok_end;
char *tok_end2;
int i;
int instance;
int targ;
int done;
char tok_list[] = {'.', ',', '{', '}', '\0'};
/* All options use a ':' name/arg separator */
if (*opt_arg != ':')
return (opt_arg);
opt_arg++;
instance = -1;
targ = -1;
done = FALSE;
/*
* Restore separator that may be in
* the middle of our option argument.
*/
tok_end = strchr(opt_arg, '\0');
if (tok_end < end)
*tok_end = ',';
while (!done) {
switch (*opt_arg) {
case '{':
if (instance == -1) {
instance = 0;
} else {
if (depth > 1) {
if (targ == -1)
targ = 0;
} else {
printf("Malformed Option %s\n",
opt_name);
done = TRUE;
}
}
opt_arg++;
break;
case '}':
if (targ != -1)
targ = -1;
else if (instance != -1)
instance = -1;
opt_arg++;
break;
case ',':
case '.':
if (instance == -1)
done = TRUE;
else if (targ >= 0)
targ++;
else if (instance >= 0)
instance++;
opt_arg++;
break;
case '\0':
done = TRUE;
break;
default:
tok_end = end;
for (i = 0; tok_list[i]; i++) {
tok_end2 = strchr(opt_arg, tok_list[i]);
if ((tok_end2) && (tok_end2 < tok_end))
tok_end = tok_end2;
}
callback(callback_arg, instance, targ,
simple_strtol(opt_arg, NULL, 0));
opt_arg = tok_end;
break;
}
}
return (opt_arg);
}
...@@ -870,6 +870,7 @@ aic_sector_div(sector_t capacity, int heads, int sectors) ...@@ -870,6 +870,7 @@ aic_sector_div(sector_t capacity, int heads, int sectors)
#define aic_calc_speed AIC_LIB_ENTRY(_calc_speed) #define aic_calc_speed AIC_LIB_ENTRY(_calc_speed)
#define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match) #define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match)
#define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match) #define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match)
#define aic_parse_brace_option AIC_LIB_ENTRY(_parse_brace_option)
/******************************************************************************/ /******************************************************************************/
...@@ -905,6 +906,10 @@ int aic_inquiry_match(caddr_t /*inqbuffer*/, ...@@ -905,6 +906,10 @@ int aic_inquiry_match(caddr_t /*inqbuffer*/,
int aic_static_inquiry_match(caddr_t /*inqbuffer*/, int aic_static_inquiry_match(caddr_t /*inqbuffer*/,
caddr_t /*table_entry*/); caddr_t /*table_entry*/);
typedef void aic_option_callback_t(void *, int, int, int32_t);
char * aic_parse_brace_option(char *opt_name, char *opt_arg,
char *end, int depth,
aic_option_callback_t *, void *);
static __inline void scsi_extract_sense(struct scsi_sense_data *sense, static __inline void scsi_extract_sense(struct scsi_sense_data *sense,
int *error_code, int *sense_key, int *error_code, int *sense_key,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment