xref: /openbsd-src/sys/dev/usb/umass_quirks.c (revision 8500990981f885cbe5e6a4958549cacc238b5ae6)
1 /*	$OpenBSD: umass_quirks.c,v 1.7 2003/11/27 12:35:58 henning Exp $	*/
2 /*	$NetBSD: umass_quirks.c,v 1.39 2003/05/08 15:19:47 augustss Exp $	*/
3 
4 /*
5  * Copyright (c) 2001 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by MAEKAWA Masahide (gehenna@NetBSD.org).
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *	  This product includes software developed by the NetBSD
22  *	  Foundation, Inc. and its contributors.
23  * 4. Neither the name of The NetBSD Foundation nor the names of its
24  *    contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37  * POSSIBILITY OF SUCH DAMAGE.
38  */
39 
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/device.h>
43 #include <sys/buf.h>
44 
45 #if defined(__NetBSD__)
46 #include <dev/scsipi/scsipi_all.h> /* for scsiconf.h below */
47 #include <dev/scsipi/scsiconf.h> /* for quirks defines */
48 #elif defined(__OpenBSD__)
49 #include <scsi/scsi_all.h>
50 #include <scsi/scsiconf.h>
51 #endif
52 
53 #include <dev/usb/usb.h>
54 #include <dev/usb/usbdi.h>
55 #include <dev/usb/usbdevs.h>
56 
57 #include <dev/usb/umassvar.h>
58 #include <dev/usb/umass_quirks.h>
59 
60 Static usbd_status umass_init_insystem(struct umass_softc *);
61 Static usbd_status umass_init_shuttle(struct umass_softc *);
62 
63 Static void umass_fixup_sony(struct umass_softc *);
64 Static void umass_fixup_yedata(struct umass_softc *);
65 
66 Static const struct umass_quirk umass_quirks[] = {
67 	{ { USB_VENDOR_ATI, USB_PRODUCT_ATI2_205 },
68 	  UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
69 	  0,
70 	  0,
71 	  UMATCH_VENDOR_PRODUCT,
72 	  NULL, NULL
73 	},
74 
75 	{ { USB_VENDOR_DMI, USB_PRODUCT_DMI_SA2_0 },
76 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
77 	  0,
78 	  PQUIRK_NOMODESENSE,
79 	  UMATCH_VENDOR_PRODUCT,
80 	  NULL, NULL
81 	},
82 
83 	{ { USB_VENDOR_EASYDISK, USB_PRODUCT_EASYDISK_EASYDISK },
84 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
85 	  0,
86 	  PQUIRK_NOMODESENSE,
87 	  UMATCH_VENDOR_PRODUCT,
88 	  NULL, NULL
89 	},
90 
91 	{ { USB_VENDOR_FUJIPHOTO, USB_PRODUCT_FUJIPHOTO_MASS0100 },
92 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
93 	  UMASS_QUIRK_NO_START_STOP,
94 	  PQUIRK_NOTUR | PQUIRK_NOSENSE,
95 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
96 	  NULL, NULL
97 	},
98 
99 	{ { USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB },
100 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
101 	  UMASS_QUIRK_FORCE_SHORT_INQUIRY | UMASS_QUIRK_NO_START_STOP,
102 	  PQUIRK_NOMODESENSE,
103 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
104 	  NULL, NULL
105 	},
106 
107 	{ { USB_VENDOR_HP, USB_PRODUCT_HP_CDWRITERPLUS },
108 	  UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
109 	  0,
110 	  PQUIRK_NOSENSE | PQUIRK_NOMODESENSE,
111 	  UMATCH_VENDOR_PRODUCT,
112 	  NULL, NULL
113 	},
114 
115 	{ { USB_VENDOR_IMATION, USB_PRODUCT_IMATION_FLASHGO },
116 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
117 	  0,
118 	  PQUIRK_NODOORLOCK,
119 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
120 	  NULL, NULL
121 	},
122 
123 	{ { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ADAPTERV2 },
124 	  UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
125 	  0,
126 	  0,
127 	  UMATCH_VENDOR_PRODUCT,
128 	  NULL, NULL
129 	},
130 
131 	{ { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ATAPI },
132 	  UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
133 	  0,
134 	  0,
135 	  UMATCH_VENDOR_PRODUCT,
136 	  NULL, NULL
137 	},
138 
139 	{ { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_DRIVEV2_5 },
140 	  UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
141 	  0,
142 	  0,
143 	  UMATCH_VENDOR_PRODUCT,
144 	  NULL, NULL
145 	},
146 
147 	{ { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_IDEUSB2 },
148 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
149 	  0,
150 	  PQUIRK_NOMODESENSE,
151 	  UMATCH_VENDOR_PRODUCT,
152 	  NULL, NULL
153 	},
154 
155 	{ { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_USBCABLE },
156 	  UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
157 	  UMASS_QUIRK_NO_START_STOP,
158 	  PQUIRK_NOTUR,
159 	  UMATCH_VENDOR_PRODUCT,
160 	  umass_init_insystem, NULL
161 	},
162 
163 	{ { USB_VENDOR_IODATA2, USB_PRODUCT_IODATA2_USB2SC },
164 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
165 	  0,
166 	  0,
167 	  UMATCH_VENDOR_PRODUCT,
168 	  NULL, NULL
169 	},
170 
171 	{ { USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP100 },
172 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
173 	  0,
174 	  PQUIRK_NOTUR,
175 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
176 	  NULL, NULL
177 	},
178 
179 	{ { USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP250 },
180 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
181 	  0,
182 	  PQUIRK_NOTUR,
183 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
184 	  NULL, NULL
185 	},
186 
187 	{ { USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP250_2 },
188 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
189 	  UMASS_QUIRK_NO_START_STOP,
190 	  PQUIRK_NOTUR,
191 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
192 	  NULL, NULL
193 	},
194 
195 	{ { USB_VENDOR_MELCO, USB_PRODUCT_MELCO_DUBPXXG },
196 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
197 	  UMASS_QUIRK_FORCE_SHORT_INQUIRY | UMASS_QUIRK_NO_START_STOP,
198 	  PQUIRK_NOMODESENSE,
199 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
200 	  NULL, NULL
201 	},
202 
203 	{ { USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_DPCM },
204 	  UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
205 	  0,
206 	  PQUIRK_NOTUR,
207 	  UMATCH_VENDOR_PRODUCT,
208 	  NULL, NULL
209 	},
210 
211 	{ { USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_S304 },
212 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
213 	  UMASS_QUIRK_NO_MAX_LUN | UMASS_QUIRK_NO_START_STOP,
214 	  0,
215 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
216 	  NULL, NULL
217 	},
218 
219 	{ { USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_X },
220 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
221 	  UMASS_QUIRK_NO_MAX_LUN | UMASS_QUIRK_NO_START_STOP,
222 	  0,
223 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
224 	  NULL, NULL
225 	},
226 
227 	{ { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY },
228 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
229 	  UMASS_QUIRK_NO_MAX_LUN,
230 	  PQUIRK_NOMODESENSE | PQUIRK_NODOORLOCK | PQUIRK_NOBIGMODESENSE,
231 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
232 	  NULL, NULL
233 	},
234 
235 	{ { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY2 },
236 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
237 	  UMASS_QUIRK_NO_MAX_LUN,
238 	  PQUIRK_NOMODESENSE | PQUIRK_NODOORLOCK | PQUIRK_NOBIGMODESENSE,
239 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
240 	  NULL, NULL
241 	},
242 
243 	{ { USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3050 },
244 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
245 	  0,
246 	  PQUIRK_NOMODESENSE | PQUIRK_FORCELUNS,
247 	  UMATCH_VENDOR_PRODUCT,
248 	  NULL, NULL
249 	},
250 
251 	{ { USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND5010 },
252 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
253 	  0,
254 	  PQUIRK_NOMODESENSE | PQUIRK_FORCELUNS,
255 	  UMATCH_VENDOR_PRODUCT,
256 	  NULL, NULL
257 	},
258 
259 	{ { USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C1 },
260 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
261 	  UMASS_QUIRK_WRONG_CSWSIG,
262 	  0,
263 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
264 	  NULL, NULL
265 	},
266 
267 	{ { USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C700 },
268 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
269 	  0,
270 	  PQUIRK_ONLYBIG | SDEV_NOSYNCCACHE,
271 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
272 	  NULL, NULL
273 	},
274 
275 	{ { USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MD1II },
276 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
277 	  UMASS_QUIRK_NO_MAX_LUN | UMASS_QUIRK_NO_START_STOP,
278 	  PQUIRK_NOMODESENSE,
279 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
280 	  NULL, NULL
281 	},
282 
283 	{ { USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MD2 },
284 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
285 	  0,
286 	  PQUIRK_NOMODESENSE,
287 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
288 	  NULL, NULL
289 	},
290 
291 	{ { USB_VENDOR_OTI, USB_PRODUCT_OTI_SOLID },
292 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
293 	  0,
294 	  PQUIRK_NOMODESENSE | PQUIRK_NOBIGMODESENSE,
295 	  UMATCH_VENDOR_PRODUCT,
296 	  NULL, NULL
297 	},
298 
299 	{ { USB_VENDOR_PEN, USB_PRODUCT_PEN_MOBILEDRIVE },
300 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
301 	  0,
302 	  PQUIRK_NOMODESENSE | PQUIRK_NODOORLOCK | PQUIRK_FORCELUNS,
303 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
304 	  NULL, NULL
305 	},
306 
307 	{ { USB_VENDOR_PEN, USB_PRODUCT_PEN_USBDISK },
308 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
309 	  UMASS_QUIRK_NO_MAX_LUN | UMASS_QUIRK_NO_START_STOP,
310 	  0,
311 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
312 	  NULL, NULL
313 	},
314 
315 	{ { USB_VENDOR_PEN, USB_PRODUCT_PEN_USBREADER },
316 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
317 	  0,
318 	  PQUIRK_NOMODESENSE,
319 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
320 	  NULL, NULL
321 	},
322 
323 	{ { USB_VENDOR_PILOTECH, USB_PRODUCT_PILOTECH_CRW600 },
324 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
325 	  0,
326 	  PQUIRK_NOMODESENSE | PQUIRK_FORCELUNS,
327 	  UMATCH_VENDOR_PRODUCT,
328 	  NULL, NULL
329 	},
330 
331 	{ { USB_VENDOR_PQI, USB_PRODUCT_PQI_TRAVELFLASH },
332 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
333 	  0,
334 	  PQUIRK_NOMODESENSE | PQUIRK_NODOORLOCK,
335 	  UMATCH_VENDOR_PRODUCT,
336 	  NULL, NULL
337 	},
338 
339 	{ { USB_VENDOR_SCANLOGIC, USB_PRODUCT_SCANLOGIC_SL11R },
340 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UFI,
341 	  UMASS_QUIRK_WRONG_CSWTAG,
342 	  0,
343 	  UMATCH_VENDOR_PRODUCT,
344 	  NULL, NULL
345 	},
346 
347 	{ { USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSB },
348 	  UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI,
349 	  UMASS_QUIRK_NO_START_STOP,
350 	  PQUIRK_NOTUR,
351 	  UMATCH_VENDOR_PRODUCT,
352 	  umass_init_shuttle, NULL
353 	},
354 
355 	{ { USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_ZIOMMC },
356 	  UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI,
357 	  UMASS_QUIRK_NO_START_STOP,
358 	  PQUIRK_NOTUR,
359 	  UMATCH_VENDOR_PRODUCT,
360 	  NULL, NULL
361 	},
362 
363 	{ { USB_VENDOR_SIIG, USB_PRODUCT_SIIG_MULTICARDREADER },
364 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
365 	  UMASS_QUIRK_NO_START_STOP,
366 	  0,
367 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
368 	  NULL,NULL
369 	},
370 
371 	{ { USB_VENDOR_SONY, USB_PRODUCT_SONY_DRIVEV2 },
372 	  UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
373 	  0,
374 	  0,
375 	  UMATCH_VENDOR_PRODUCT,
376 	  NULL, NULL
377 	},
378 
379 	{ { USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC },
380 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
381 	  0,
382 	  0,
383 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
384 	  NULL, umass_fixup_sony
385 	},
386 
387 	{ { USB_VENDOR_SONY, USB_PRODUCT_SONY_MSC },
388 	  UMASS_WPROTO_CBI, UMASS_CPROTO_UFI,
389 	  UMASS_QUIRK_FORCE_SHORT_INQUIRY | UMASS_QUIRK_RS_NO_CLEAR_UA,
390 	  PQUIRK_NOMODESENSE,
391 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
392 	  NULL, NULL
393 	},
394 
395 	{ { USB_VENDOR_TEAC, USB_PRODUCT_TEAC_FD05PUB },
396 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
397 	  0,
398 	  PQUIRK_NOMODESENSE,
399 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
400 	  NULL, NULL
401 	},
402 
403 	{ { USB_VENDOR_TREK, USB_PRODUCT_TREK_THUMBDRIVE_8MB },
404 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
405 	  0,
406 	  PQUIRK_NODOORLOCK,
407 	  UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
408 	  NULL, NULL
409 	},
410 
411 	{ { USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_XXX1100 },
412 	  UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
413 	  0,
414 	  0,
415 	  UMATCH_VENDOR_PRODUCT,
416 	  NULL, NULL
417 	},
418 
419 	{ { USB_VENDOR_YANO, USB_PRODUCT_YANO_U640MO },
420 	  UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI,
421 	  UMASS_QUIRK_FORCE_SHORT_INQUIRY,
422 	  0,
423 	  UMATCH_VENDOR_PRODUCT,
424 	  NULL, NULL
425 	},
426 
427 	{ { USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU },
428 	  UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UFI,
429 	  UMASS_QUIRK_RS_NO_CLEAR_UA,
430 	  PQUIRK_NOMODESENSE,
431 	  UMATCH_VENDOR_PRODUCT_REV,
432 	  NULL, umass_fixup_yedata
433 	},
434 
435        { { USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_DNSSF7X},
436          UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
437          0,
438          SDEV_NOSYNCCACHE | PQUIRK_NODOORLOCK,
439          UMATCH_VENDOR_PRODUCT,
440          NULL, NULL
441        },
442 };
443 
444 const struct umass_quirk *
445 umass_lookup(u_int16_t vendor, u_int16_t product)
446 {
447 	return ((const struct umass_quirk *)
448 		usb_lookup(umass_quirks, vendor, product));
449 }
450 
451 Static usbd_status
452 umass_init_insystem(struct umass_softc *sc)
453 {
454 	usbd_status err;
455 
456 	err = usbd_set_interface(sc->sc_iface, 1);
457 	if (err) {
458 		DPRINTF(UDMASS_USB,
459 			("%s: could not switch to Alt Interface 1\n",
460 			USBDEVNAME(sc->sc_dev)));
461 		return (err);
462 	}
463 
464 	return (USBD_NORMAL_COMPLETION);
465 }
466 
467 Static usbd_status
468 umass_init_shuttle(struct umass_softc *sc)
469 {
470 	usb_device_request_t req;
471 	u_int8_t status[2];
472 
473 	/* The Linux driver does this */
474 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
475 	req.bRequest = 1;
476 	USETW(req.wValue, 0);
477 	USETW(req.wIndex, sc->sc_ifaceno);
478 	USETW(req.wLength, sizeof(status));
479 
480 	return (usbd_do_request(sc->sc_udev, &req, &status));
481 }
482 
483 Static void
484 umass_fixup_sony(struct umass_softc *sc)
485 {
486 	usb_interface_descriptor_t *id;
487 
488 	id = usbd_get_interface_descriptor(sc->sc_iface);
489 	if (id->bInterfaceSubClass == 0xff) {
490 		sc->sc_cmd = UMASS_CPROTO_RBC;
491 	}
492 }
493 
494 Static void
495 umass_fixup_yedata(struct umass_softc *sc)
496 {
497 	usb_device_descriptor_t *dd;
498 
499 	dd = usbd_get_device_descriptor(sc->sc_udev);
500 
501 	/*
502 	 * Revisions < 1.28 do not handle the interrupt endpoint very well.
503 	 */
504 	if (UGETW(dd->bcdDevice) < 0x128)
505 		sc->sc_wire = UMASS_WPROTO_CBI;
506 	else
507 		sc->sc_wire = UMASS_WPROTO_CBI_I;
508 
509 	/*
510 	 * Revisions < 1.28 do not have the TEST UNIT READY command
511 	 * Revisions == 1.28 have a broken TEST UNIT READY
512 	 */
513 	if (UGETW(dd->bcdDevice) <= 0x128)
514 		sc->sc_busquirks |= PQUIRK_NOTUR;
515 }
516