This source file includes following definitions.
- umass_lookup
- umass_init_insystem
- umass_init_shuttle
- umass_fixup_sony
- umass_fixup_yedata
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/device.h>
43 #include <sys/buf.h>
44
45 #include <scsi/scsi_all.h>
46 #include <scsi/scsiconf.h>
47
48 #include <dev/usb/usb.h>
49 #include <dev/usb/usbdi.h>
50 #include <dev/usb/usbdevs.h>
51
52 #include <dev/usb/umassvar.h>
53 #include <dev/usb/umass_quirks.h>
54
55 usbd_status umass_init_insystem(struct umass_softc *);
56 usbd_status umass_init_shuttle(struct umass_softc *);
57
58 void umass_fixup_sony(struct umass_softc *);
59 void umass_fixup_yedata(struct umass_softc *);
60
61 const struct umass_quirk umass_quirks[] = {
62 { { USB_VENDOR_ATI, USB_PRODUCT_ATI2_205 },
63 UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
64 0,
65 0,
66 UMATCH_VENDOR_PRODUCT,
67 NULL, NULL
68 },
69
70 { { USB_VENDOR_DMI, USB_PRODUCT_DMI_SA2_0 },
71 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
72 0,
73 0,
74 UMATCH_VENDOR_PRODUCT,
75 NULL, NULL
76 },
77
78 { { USB_VENDOR_EASYDISK, USB_PRODUCT_EASYDISK_EASYDISK },
79 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
80 0,
81 0,
82 UMATCH_VENDOR_PRODUCT,
83 NULL, NULL
84 },
85
86 { { USB_VENDOR_FUJIPHOTO, USB_PRODUCT_FUJIPHOTO_MASS0100 },
87 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
88 0,
89 ADEV_NOSENSE,
90 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
91 NULL, NULL
92 },
93
94 { { USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL641USB },
95 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
96 0,
97 0,
98 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
99 NULL, NULL
100 },
101
102 { { USB_VENDOR_HP, USB_PRODUCT_HP_CDWRITERPLUS },
103 UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
104 0,
105 ADEV_NOSENSE,
106 UMATCH_VENDOR_PRODUCT,
107 NULL, NULL
108 },
109
110 { { USB_VENDOR_IMATION, USB_PRODUCT_IMATION_FLASHGO },
111 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
112 0,
113 0,
114 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
115 NULL, NULL
116 },
117
118 { { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ADAPTERV2 },
119 UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
120 0,
121 0,
122 UMATCH_VENDOR_PRODUCT,
123 NULL, NULL
124 },
125 { { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_ATAPI },
126 UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
127 0,
128 0,
129 UMATCH_VENDOR_PRODUCT,
130 NULL, NULL
131 },
132 { { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_DRIVEV2_5 },
133 UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
134 0,
135 0,
136 UMATCH_VENDOR_PRODUCT,
137 NULL, NULL
138 },
139
140 { { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_IDEUSB2 },
141 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
142 0,
143 0,
144 UMATCH_VENDOR_PRODUCT,
145 NULL, NULL
146 },
147
148 { { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_USBCABLE },
149 UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
150 0,
151 0,
152 UMATCH_VENDOR_PRODUCT,
153 umass_init_insystem, NULL
154 },
155
156 { { USB_VENDOR_IODATA2, USB_PRODUCT_IODATA2_USB2SC },
157 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
158 0,
159 0,
160 UMATCH_VENDOR_PRODUCT,
161 NULL, NULL
162 },
163
164 { { USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP100 },
165 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
166 0,
167 0,
168 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
169 NULL, NULL
170 },
171
172 { { USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP250 },
173 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
174 0,
175 0,
176 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
177 NULL, NULL
178 },
179
180 { { USB_VENDOR_IOMEGA, USB_PRODUCT_IOMEGA_ZIP250_2 },
181 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
182 0,
183 0,
184 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
185 NULL, NULL
186 },
187
188 { { USB_VENDOR_IRIVER, USB_PRODUCT_IRIVER_IFP_1XX },
189 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
190 0,
191 SDEV_ONLYBIG,
192 UMATCH_VENDOR_PRODUCT,
193 NULL, NULL
194 },
195
196 { { USB_VENDOR_IRIVER, USB_PRODUCT_IRIVER_IFP_3XX },
197 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
198 0,
199 0,
200 UMATCH_VENDOR_PRODUCT,
201 NULL, NULL
202 },
203
204 { { USB_VENDOR_MELCO, USB_PRODUCT_MELCO_DUBPXXG },
205 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
206 0,
207 0,
208 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
209 NULL, NULL
210 },
211
212 { { USB_VENDOR_MICROTECH, USB_PRODUCT_MICROTECH_DPCM },
213 UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
214 0,
215 0,
216 UMATCH_VENDOR_PRODUCT,
217 NULL, NULL
218 },
219
220 { { USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_S304 },
221 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
222 0,
223 0,
224 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
225 NULL, NULL
226 },
227
228 { { USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_X },
229 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
230 0,
231 0,
232 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
233 NULL, NULL
234 },
235
236 { { USB_VENDOR_MINOLTA, USB_PRODUCT_MINOLTA_DIMAGEA1 },
237 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
238 0,
239 0,
240 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
241 NULL, NULL
242 },
243
244 { { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY },
245 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
246 0,
247 0,
248 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
249 NULL, NULL
250 },
251
252 { { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY2 },
253 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_ATAPI,
254 0,
255 0,
256 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
257 NULL, NULL
258 },
259
260 { { USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND3050 },
261 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
262 0,
263 0,
264 UMATCH_VENDOR_PRODUCT,
265 NULL, NULL
266 },
267
268 { { USB_VENDOR_NEODIO, USB_PRODUCT_NEODIO_ND5010 },
269 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
270 0,
271 0,
272 UMATCH_VENDOR_PRODUCT,
273 NULL, NULL
274 },
275
276 { { USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C1 },
277 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
278 UMASS_QUIRK_WRONG_CSWSIG,
279 0,
280 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
281 NULL, NULL
282 },
283
284 { { USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C700 },
285 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
286 0,
287 SDEV_ONLYBIG | SDEV_NOSYNCCACHE,
288 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
289 NULL, NULL
290 },
291
292 { { USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MD1II },
293 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
294 0,
295 0,
296 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
297 NULL, NULL
298 },
299
300 { { USB_VENDOR_ONSPEC, USB_PRODUCT_ONSPEC_MD2 },
301 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
302 0,
303 0,
304 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
305 NULL, NULL
306 },
307
308 { { USB_VENDOR_OTI, USB_PRODUCT_OTI_SOLID },
309 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
310 0,
311 0,
312 UMATCH_VENDOR_PRODUCT,
313 NULL, NULL
314 },
315
316 { { USB_VENDOR_PEN, USB_PRODUCT_PEN_MOBILEDRIVE },
317 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
318 0,
319 0,
320 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
321 NULL, NULL
322 },
323
324 { { USB_VENDOR_PEN, USB_PRODUCT_PEN_USBDISK },
325 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
326 0,
327 0,
328 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
329 NULL, NULL
330 },
331
332 { { USB_VENDOR_PEN, USB_PRODUCT_PEN_USBREADER },
333 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
334 0,
335 0,
336 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
337 NULL, NULL
338 },
339
340 { { USB_VENDOR_PILOTECH, USB_PRODUCT_PILOTECH_CRW600 },
341 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
342 0,
343 0,
344 UMATCH_VENDOR_PRODUCT,
345 NULL, NULL
346 },
347
348 { { USB_VENDOR_PQI, USB_PRODUCT_PQI_TRAVELFLASH },
349 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
350 0,
351 0,
352 UMATCH_VENDOR_PRODUCT,
353 NULL, NULL
354 },
355
356 { { USB_VENDOR_SCANLOGIC, USB_PRODUCT_SCANLOGIC_SL11R },
357 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
358 UMASS_QUIRK_WRONG_CSWTAG,
359 0,
360 UMATCH_VENDOR_PRODUCT,
361 NULL, NULL
362 },
363
364 { { USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSB },
365 UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI,
366 0,
367 ADEV_NOSENSE,
368 UMATCH_VENDOR_PRODUCT,
369 umass_init_shuttle, NULL
370 },
371
372 { { USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_ZIOMMC },
373 UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI,
374 0,
375 0,
376 UMATCH_VENDOR_PRODUCT,
377 NULL, NULL
378 },
379
380 { { USB_VENDOR_SIIG, USB_PRODUCT_SIIG_MULTICARDREADER },
381 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
382 0,
383 0,
384 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
385 NULL,NULL
386 },
387
388 { { USB_VENDOR_SONY, USB_PRODUCT_SONY_DRIVEV2 },
389 UMASS_WPROTO_BBB, UMASS_CPROTO_ISD_ATA,
390 0,
391 0,
392 UMATCH_VENDOR_PRODUCT,
393 NULL, NULL
394 },
395
396 { { USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC },
397 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
398 0,
399 0,
400 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
401 NULL, umass_fixup_sony
402 },
403
404 { { USB_VENDOR_SONY, USB_PRODUCT_SONY_MSC },
405 UMASS_WPROTO_CBI, UMASS_CPROTO_UFI,
406 0,
407 0,
408 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
409 NULL, NULL
410 },
411
412 { { USB_VENDOR_TEAC, USB_PRODUCT_TEAC_FD05PUB },
413 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
414 0,
415 0,
416 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
417 NULL, NULL
418 },
419
420 { { USB_VENDOR_TREK, USB_PRODUCT_TREK_THUMBDRIVE_8MB },
421 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
422 0,
423 0,
424 UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO,
425 NULL, NULL
426 },
427
428 { { USB_VENDOR_TRUMPION, USB_PRODUCT_TRUMPION_XXX1100 },
429 UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI,
430 0,
431 0,
432 UMATCH_VENDOR_PRODUCT,
433 NULL, NULL
434 },
435
436 { { USB_VENDOR_YANO, USB_PRODUCT_YANO_U640MO },
437 UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI,
438 0,
439 0,
440 UMATCH_VENDOR_PRODUCT,
441 NULL, NULL
442 },
443
444 { { USB_VENDOR_YEDATA, USB_PRODUCT_YEDATA_FLASHBUSTERU },
445 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UFI,
446 0,
447 0,
448 UMATCH_VENDOR_PRODUCT_REV,
449 NULL, umass_fixup_yedata
450 },
451
452 { { USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_DNSSF7X},
453 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
454 0,
455 SDEV_NOSYNCCACHE,
456 UMATCH_VENDOR_PRODUCT,
457 NULL, NULL
458 },
459
460 { { USB_VENDOR_CREATIVE, USB_PRODUCT_CREATIVE_NOMAD},
461 UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC,
462 0,
463 SDEV_NOSYNCCACHE,
464 UMATCH_VENDOR_PRODUCT,
465 NULL, NULL
466 },
467 };
468
469 const struct umass_quirk *
470 umass_lookup(u_int16_t vendor, u_int16_t product)
471 {
472 return ((const struct umass_quirk *)
473 usb_lookup(umass_quirks, vendor, product));
474 }
475
476 usbd_status
477 umass_init_insystem(struct umass_softc *sc)
478 {
479 usbd_status err;
480
481 err = usbd_set_interface(sc->sc_iface, 1);
482 if (err) {
483 DPRINTF(UDMASS_USB,
484 ("%s: could not switch to Alt Interface 1\n",
485 sc->sc_dev.dv_xname));
486 return (err);
487 }
488
489 return (USBD_NORMAL_COMPLETION);
490 }
491
492 usbd_status
493 umass_init_shuttle(struct umass_softc *sc)
494 {
495 usb_device_request_t req;
496 u_int8_t status[2];
497
498
499 req.bmRequestType = UT_READ_VENDOR_DEVICE;
500 req.bRequest = 1;
501 USETW(req.wValue, 0);
502 USETW(req.wIndex, sc->sc_ifaceno);
503 USETW(req.wLength, sizeof(status));
504
505 return (usbd_do_request(sc->sc_udev, &req, &status));
506 }
507
508 void
509 umass_fixup_sony(struct umass_softc *sc)
510 {
511 usb_interface_descriptor_t *id;
512 usb_device_descriptor_t *dd;
513
514 id = usbd_get_interface_descriptor(sc->sc_iface);
515 if (id->bInterfaceSubClass == 0xff) {
516 dd = usbd_get_device_descriptor(sc->sc_udev);
517
518
519
520
521 switch (UGETW(dd->bcdDevice)) {
522 case 0x611:
523 case 0x600:
524 case 0x500:
525 sc->sc_cmd = UMASS_CPROTO_UFI;
526 break;
527 default:
528 sc->sc_cmd = UMASS_CPROTO_SCSI;
529 }
530 }
531 }
532
533 void
534 umass_fixup_yedata(struct umass_softc *sc)
535 {
536 usb_device_descriptor_t *dd;
537
538 dd = usbd_get_device_descriptor(sc->sc_udev);
539
540
541
542
543 if (UGETW(dd->bcdDevice) < 0x128)
544 sc->sc_wire = UMASS_WPROTO_CBI;
545 else
546 sc->sc_wire = UMASS_WPROTO_CBI_I;
547 }