diff options
Diffstat (limited to 'drivers/scsi/scsi_devinfo.c')
| -rw-r--r-- | drivers/scsi/scsi_devinfo.c | 89 | 
1 files changed, 89 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index 43fad4c09be..f969aca0b54 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c @@ -172,6 +172,7 @@ static struct {  	{"HITACHI", "DF400", "*", BLIST_REPORTLUN2},  	{"HITACHI", "DF500", "*", BLIST_REPORTLUN2},  	{"HITACHI", "DISK-SUBSYSTEM", "*", BLIST_REPORTLUN2}, +	{"HITACHI", "HUS1530", "*", BLIST_NO_DIF},  	{"HITACHI", "OPEN-", "*", BLIST_REPORTLUN2},  	{"HITACHI", "OP-C-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},  	{"HITACHI", "3380-", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, @@ -197,6 +198,7 @@ static struct {  	{"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN},  	{"IBM", "2105", NULL, BLIST_RETRY_HWERROR},  	{"iomega", "jaz 1GB", "J.86", BLIST_NOTQ | BLIST_NOLUN}, +	{"IOMEGA", "ZIP", NULL, BLIST_NOTQ | BLIST_NOLUN},  	{"IOMEGA", "Io20S         *F", NULL, BLIST_KEY},  	{"INSITE", "Floptical   F*8I", NULL, BLIST_KEY},  	{"INSITE", "I325VM", NULL, BLIST_KEY}, @@ -226,6 +228,7 @@ static struct {  	{"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN},  	{"SEAGATE", "ST34555N", "0930", BLIST_NOTQ},	/* Chokes on tagged INQUIRY */  	{"SEAGATE", "ST3390N", "9546", BLIST_NOTQ}, +	{"SEAGATE", "ST900MM0006", NULL, BLIST_SKIP_VPD_PAGES},  	{"SGI", "RAID3", "*", BLIST_SPARSELUN},  	{"SGI", "RAID5", "*", BLIST_SPARSELUN},  	{"SGI", "TP9100", "*", BLIST_REPORTLUN2}, @@ -243,6 +246,7 @@ static struct {  	{"Tornado-", "F4", "*", BLIST_NOREPORTLUN},  	{"TOSHIBA", "CDROM", NULL, BLIST_ISROM},  	{"TOSHIBA", "CD-ROM", NULL, BLIST_ISROM}, +	{"Traxdata", "CDR4120", NULL, BLIST_NOLUN},	/* locks up */  	{"USB2.0", "SMARTMEDIA/XD", NULL, BLIST_FORCELUN | BLIST_INQUIRY_36},  	{"WangDAT", "Model 2600", "01.7", BLIST_SELECT_NO_ATN},  	{"WangDAT", "Model 3200", "02.2", BLIST_SELECT_NO_ATN}, @@ -382,6 +386,91 @@ int scsi_dev_info_list_add_keyed(int compatible, char *vendor, char *model,  EXPORT_SYMBOL(scsi_dev_info_list_add_keyed);  /** + * scsi_dev_info_list_del_keyed - remove one dev_info list entry. + * @vendor:	vendor string + * @model:	model (product) string + * @key:	specify list to use + * + * Description: + * 	Remove and destroy one dev_info entry for @vendor, @model + * 	in list specified by @key. + * + * Returns: 0 OK, -error on failure. + **/ +int scsi_dev_info_list_del_keyed(char *vendor, char *model, int key) +{ +	struct scsi_dev_info_list *devinfo, *found = NULL; +	struct scsi_dev_info_list_table *devinfo_table = +		scsi_devinfo_lookup_by_key(key); + +	if (IS_ERR(devinfo_table)) +		return PTR_ERR(devinfo_table); + +	list_for_each_entry(devinfo, &devinfo_table->scsi_dev_info_list, +			    dev_info_list) { +		if (devinfo->compatible) { +			/* +			 * Behave like the older version of get_device_flags. +			 */ +			size_t max; +			/* +			 * XXX why skip leading spaces? If an odd INQUIRY +			 * value, that should have been part of the +			 * scsi_static_device_list[] entry, such as "  FOO" +			 * rather than "FOO". Since this code is already +			 * here, and we don't know what device it is +			 * trying to work with, leave it as-is. +			 */ +			max = 8;	/* max length of vendor */ +			while ((max > 0) && *vendor == ' ') { +				max--; +				vendor++; +			} +			/* +			 * XXX removing the following strlen() would be +			 * good, using it means that for a an entry not in +			 * the list, we scan every byte of every vendor +			 * listed in scsi_static_device_list[], and never match +			 * a single one (and still have to compare at +			 * least the first byte of each vendor). +			 */ +			if (memcmp(devinfo->vendor, vendor, +				    min(max, strlen(devinfo->vendor)))) +				continue; +			/* +			 * Skip spaces again. +			 */ +			max = 16;	/* max length of model */ +			while ((max > 0) && *model == ' ') { +				max--; +				model++; +			} +			if (memcmp(devinfo->model, model, +				   min(max, strlen(devinfo->model)))) +				continue; +			found = devinfo; +		} else { +			if (!memcmp(devinfo->vendor, vendor, +				     sizeof(devinfo->vendor)) && +			     !memcmp(devinfo->model, model, +				      sizeof(devinfo->model))) +				found = devinfo; +		} +		if (found) +			break; +	} + +	if (found) { +		list_del(&found->dev_info_list); +		kfree(found); +		return 0; +	} + +	return -ENOENT; +} +EXPORT_SYMBOL(scsi_dev_info_list_del_keyed); + +/**   * scsi_dev_info_list_add_str - parse dev_list and add to the scsi_dev_info_list.   * @dev_list:	string of device flags to add   *  | 
