1 1.102 flxd /* $NetBSD: umass_quirks.c,v 1.102 2020/06/19 11:52:42 flxd Exp $ */ 2 1.1 gehenna 3 1.1 gehenna /* 4 1.68 mycroft * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc. 5 1.1 gehenna * All rights reserved. 6 1.1 gehenna * 7 1.1 gehenna * This code is derived from software contributed to The NetBSD Foundation 8 1.1 gehenna * by MAEKAWA Masahide (gehenna (at) NetBSD.org). 9 1.68 mycroft * This code is derived from software contributed to The NetBSD Foundation 10 1.68 mycroft * by Charles M. Hannum. 11 1.1 gehenna * 12 1.1 gehenna * Redistribution and use in source and binary forms, with or without 13 1.1 gehenna * modification, are permitted provided that the following conditions 14 1.1 gehenna * are met: 15 1.1 gehenna * 1. Redistributions of source code must retain the above copyright 16 1.1 gehenna * notice, this list of conditions and the following disclaimer. 17 1.1 gehenna * 2. Redistributions in binary form must reproduce the above copyright 18 1.1 gehenna * notice, this list of conditions and the following disclaimer in the 19 1.1 gehenna * documentation and/or other materials provided with the distribution. 20 1.1 gehenna * 21 1.1 gehenna * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 22 1.1 gehenna * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23 1.1 gehenna * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 1.1 gehenna * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 25 1.1 gehenna * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 1.1 gehenna * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 1.1 gehenna * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 1.1 gehenna * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 1.1 gehenna * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 1.1 gehenna * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 1.1 gehenna * POSSIBILITY OF SUCH DAMAGE. 32 1.1 gehenna */ 33 1.44 lukem 34 1.44 lukem #include <sys/cdefs.h> 35 1.102 flxd __KERNEL_RCSID(0, "$NetBSD: umass_quirks.c,v 1.102 2020/06/19 11:52:42 flxd Exp $"); 36 1.99 skrll 37 1.99 skrll #ifdef _KERNEL_OPT 38 1.99 skrll #include "opt_usb.h" 39 1.99 skrll #endif 40 1.1 gehenna 41 1.1 gehenna #include <sys/param.h> 42 1.1 gehenna #include <sys/systm.h> 43 1.1 gehenna #include <sys/device.h> 44 1.1 gehenna #include <sys/buf.h> 45 1.1 gehenna 46 1.7 augustss #include <dev/scsipi/scsipi_all.h> /* for scsiconf.h below */ 47 1.7 augustss #include <dev/scsipi/scsiconf.h> /* for quirks defines */ 48 1.7 augustss 49 1.1 gehenna #include <dev/usb/usb.h> 50 1.1 gehenna #include <dev/usb/usbdi.h> 51 1.1 gehenna #include <dev/usb/usbdevs.h> 52 1.99 skrll #include <dev/usb/usbhist.h> 53 1.1 gehenna 54 1.1 gehenna #include <dev/usb/umassvar.h> 55 1.1 gehenna #include <dev/usb/umass_quirks.h> 56 1.1 gehenna 57 1.1 gehenna Static usbd_status umass_init_insystem(struct umass_softc *); 58 1.1 gehenna Static usbd_status umass_init_shuttle(struct umass_softc *); 59 1.1 gehenna 60 1.25 cjs Static void umass_fixup_sony(struct umass_softc *); 61 1.1 gehenna 62 1.65 mycroft /* 63 1.65 mycroft * XXX 64 1.65 mycroft * PLEASE NOTE that if you want quirk entries added to this table, you MUST 65 1.65 mycroft * compile a kernel with USB_DEBUG, and submit a full log of the output from 66 1.65 mycroft * whatever operation is "failing" with ?hcidebug=20 or higher and 67 1.65 mycroft * umassdebug=0xffffff. (It's usually helpful to also set MSGBUFSIZE to 68 1.65 mycroft * something "large" unless you're using a serial console.) Without this 69 1.65 mycroft * information, the source of the problem cannot be properly analyzed, and 70 1.65 mycroft * the quirk entry WILL NOT be accepted. 71 1.65 mycroft * Also, when an entry is committed to this table, a concise but clear 72 1.65 mycroft * description of the problem MUST accompany it. 73 1.65 mycroft * - mycroft 74 1.65 mycroft */ 75 1.1 gehenna Static const struct umass_quirk umass_quirks[] = { 76 1.1 gehenna { { USB_VENDOR_INSYSTEM, USB_PRODUCT_INSYSTEM_USBCABLE }, 77 1.1 gehenna UMASS_WPROTO_CBI, UMASS_CPROTO_ATAPI, 78 1.49 mycroft 0, 79 1.56 mycroft 0, 80 1.1 gehenna UMATCH_VENDOR_PRODUCT, 81 1.1 gehenna umass_init_insystem, NULL 82 1.32 augustss }, 83 1.32 augustss 84 1.58 mycroft { { USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_EUSB }, 85 1.58 mycroft UMASS_WPROTO_CBI_I, UMASS_CPROTO_ATAPI, 86 1.58 mycroft 0, 87 1.58 mycroft 0, 88 1.58 mycroft UMATCH_VENDOR_PRODUCT, 89 1.58 mycroft umass_init_shuttle, NULL 90 1.58 mycroft }, 91 1.58 mycroft 92 1.58 mycroft /* 93 1.62 wiz * These work around genuine device bugs -- returning the wrong info in 94 1.58 mycroft * the CSW block. 95 1.58 mycroft */ 96 1.1 gehenna { { USB_VENDOR_OLYMPUS, USB_PRODUCT_OLYMPUS_C1 }, 97 1.1 gehenna UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 98 1.1 gehenna UMASS_QUIRK_WRONG_CSWSIG, 99 1.7 augustss 0, 100 1.59 mycroft UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 101 1.23 gehenna NULL, NULL 102 1.23 gehenna }, 103 1.1 gehenna { { USB_VENDOR_SCANLOGIC, USB_PRODUCT_SCANLOGIC_SL11R }, 104 1.58 mycroft UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 105 1.28 erh UMASS_QUIRK_WRONG_CSWTAG, 106 1.7 augustss 0, 107 1.59 mycroft UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 108 1.64 kivinen NULL, NULL 109 1.64 kivinen }, 110 1.64 kivinen { { USB_VENDOR_SHUTTLE, USB_PRODUCT_SHUTTLE_ORCA }, 111 1.64 kivinen UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 112 1.64 kivinen UMASS_QUIRK_WRONG_CSWTAG, 113 1.64 kivinen 0, 114 1.67 mycroft UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 115 1.1 gehenna NULL, NULL 116 1.1 gehenna }, 117 1.1 gehenna 118 1.58 mycroft /* 119 1.58 mycroft * Some Sony cameras advertise a subclass code of 0xff, so we force it 120 1.58 mycroft * to the correct value iff necessary. 121 1.58 mycroft */ 122 1.26 cjs { { USB_VENDOR_SONY, USB_PRODUCT_SONY_DSC }, 123 1.25 cjs UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 124 1.71 christos UMASS_QUIRK_RBC_PAD_TO_12, 125 1.43 martin 0, 126 1.43 martin UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 127 1.43 martin NULL, umass_fixup_sony 128 1.57 mycroft }, 129 1.57 mycroft 130 1.57 mycroft /* 131 1.66 mycroft * Stupid device reports itself as SFF-8070, but actually returns a UFI 132 1.66 mycroft * interrupt descriptor. - mycroft, 2004/06/28 133 1.66 mycroft */ 134 1.66 mycroft { { USB_VENDOR_SONY, USB_PRODUCT_SONY_CLIE_40_MS }, 135 1.66 mycroft UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UFI, 136 1.66 mycroft 0, 137 1.66 mycroft 0, 138 1.67 mycroft UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 139 1.66 mycroft NULL, NULL 140 1.66 mycroft }, 141 1.66 mycroft 142 1.66 mycroft /* 143 1.75 rmind * The SONY Portable GPS strage device almost hangs up when request 144 1.75 rmind * UR_BBB_GET_MAX_LUN - disable the query logic. 145 1.75 rmind */ 146 1.75 rmind { { USB_VENDOR_SONY, USB_PRODUCT_SONY_GPS_CS1 }, 147 1.75 rmind UMASS_WPROTO_BBB, UMASS_CPROTO_UNSPEC, 148 1.75 rmind UMASS_QUIRK_NOGETMAXLUN, 149 1.75 rmind 0, 150 1.75 rmind UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 151 1.75 rmind NULL, NULL 152 1.75 rmind }, 153 1.75 rmind 154 1.75 rmind /* 155 1.57 mycroft * The DiskOnKey does not reject commands it doesn't recognize in a 156 1.57 mycroft * sane way -- rather than STALLing the bulk pipe, it continually NAKs 157 1.57 mycroft * until we time out. To prevent being screwed by this, for now we 158 1.57 mycroft * disable 10-byte MODE SENSE the klugy way. - mycroft, 2003/10/16 159 1.57 mycroft */ 160 1.57 mycroft { { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY }, 161 1.57 mycroft UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 162 1.57 mycroft 0, 163 1.57 mycroft PQUIRK_NOBIGMODESENSE, 164 1.59 mycroft UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 165 1.57 mycroft NULL, NULL 166 1.57 mycroft }, 167 1.57 mycroft { { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY2 }, 168 1.57 mycroft UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 169 1.57 mycroft 0, 170 1.57 mycroft PQUIRK_NOBIGMODESENSE, 171 1.59 mycroft UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 172 1.36 augustss NULL, NULL 173 1.4 augustss }, 174 1.69 cube { { USB_VENDOR_MSYSTEMS, USB_PRODUCT_MSYSTEMS_DISKONKEY3 }, 175 1.69 cube UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 176 1.69 cube 0, 177 1.69 cube PQUIRK_NOBIGMODESENSE, 178 1.69 cube UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO, 179 1.69 cube NULL, NULL 180 1.69 cube }, 181 1.80 jakllsch /* Some Sigmatel-based devices don't like all SCSI commands */ 182 1.74 mlelstv { { USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_MUSICSTICK }, 183 1.74 mlelstv UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 184 1.74 mlelstv 0, 185 1.74 mlelstv PQUIRK_NODOORLOCK | PQUIRK_NOSYNCCACHE, 186 1.74 mlelstv UMATCH_VENDOR_PRODUCT, 187 1.74 mlelstv NULL, NULL 188 1.74 mlelstv }, 189 1.74 mlelstv { { USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_I_BEAD100 }, 190 1.74 mlelstv UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 191 1.97 skrll 0, 192 1.74 mlelstv PQUIRK_NODOORLOCK | PQUIRK_NOSYNCCACHE, 193 1.97 skrll UMATCH_VENDOR_PRODUCT, 194 1.74 mlelstv NULL, NULL 195 1.74 mlelstv }, 196 1.74 mlelstv { { USB_VENDOR_SIGMATEL, USB_PRODUCT_SIGMATEL_I_BEAD150 }, 197 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 198 1.74 mlelstv 0, 199 1.74 mlelstv PQUIRK_NODOORLOCK | PQUIRK_NOSYNCCACHE, 200 1.74 mlelstv UMATCH_VENDOR_PRODUCT, 201 1.74 mlelstv NULL, NULL 202 1.74 mlelstv }, 203 1.80 jakllsch { { USB_VENDOR_PHILIPS, USB_PRODUCT_PHILIPS_SA235 }, 204 1.80 jakllsch UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 205 1.80 jakllsch 0, 206 1.80 jakllsch PQUIRK_NODOORLOCK | PQUIRK_NOSYNCCACHE, 207 1.80 jakllsch UMATCH_VENDOR_PRODUCT, 208 1.80 jakllsch NULL, NULL 209 1.80 jakllsch }, 210 1.81 jakllsch /* Creative Nomad MuVo, NetBSD PR 30389, FreeBSD PR 53094 */ 211 1.81 jakllsch { { USB_VENDOR_CREATIVE, USB_PRODUCT_CREATIVE_NOMAD }, 212 1.81 jakllsch UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 213 1.81 jakllsch 0, 214 1.81 jakllsch PQUIRK_NODOORLOCK | PQUIRK_NOSYNCCACHE, 215 1.81 jakllsch UMATCH_VENDOR_PRODUCT, 216 1.81 jakllsch NULL, NULL 217 1.81 jakllsch }, 218 1.80 jakllsch 219 1.80 jakllsch /* iRiver iFP-[135]xx players fail on PREVENT/ALLOW, see PR 25440 */ 220 1.80 jakllsch { { USB_VENDOR_IRIVER, USB_PRODUCT_IRIVER_IFP_1XX }, 221 1.80 jakllsch UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 222 1.80 jakllsch 0, 223 1.80 jakllsch PQUIRK_NODOORLOCK, 224 1.80 jakllsch UMATCH_VENDOR_PRODUCT, 225 1.80 jakllsch NULL, NULL 226 1.80 jakllsch }, 227 1.80 jakllsch { { USB_VENDOR_IRIVER, USB_PRODUCT_IRIVER_IFP_3XX }, 228 1.80 jakllsch UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 229 1.80 jakllsch 0, 230 1.80 jakllsch PQUIRK_NODOORLOCK, 231 1.80 jakllsch UMATCH_VENDOR_PRODUCT, 232 1.80 jakllsch NULL, NULL 233 1.80 jakllsch }, 234 1.80 jakllsch { { USB_VENDOR_IRIVER, USB_PRODUCT_IRIVER_IFP_5XX }, 235 1.80 jakllsch UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 236 1.80 jakllsch 0, 237 1.80 jakllsch PQUIRK_NODOORLOCK, 238 1.80 jakllsch UMATCH_VENDOR_PRODUCT, 239 1.80 jakllsch NULL, NULL 240 1.80 jakllsch }, 241 1.80 jakllsch 242 1.77 wiz /* Meizu M6 doesn't like synchronize-cache, see PR 40442 */ 243 1.77 wiz { { USB_VENDOR_MEIZU, USB_PRODUCT_MEIZU_M6_SL }, 244 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 245 1.77 wiz 0, 246 1.77 wiz PQUIRK_NOSYNCCACHE, 247 1.77 wiz UMATCH_VENDOR_PRODUCT, 248 1.77 wiz NULL, NULL 249 1.77 wiz }, 250 1.82 sborrill 251 1.90 jakllsch /* 252 1.98 pgoyette * SanDisk Cruzer rejects cache sync. 253 1.98 pgoyette */ 254 1.98 pgoyette { { USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_CRUZER }, 255 1.98 pgoyette UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 256 1.98 pgoyette 0, 257 1.98 pgoyette PQUIRK_NOSYNCCACHE, 258 1.98 pgoyette UMATCH_VENDOR_PRODUCT, 259 1.98 pgoyette NULL, NULL 260 1.98 pgoyette }, 261 1.98 pgoyette 262 1.98 pgoyette /* 263 1.90 jakllsch * SanDisk Sansa Clip rejects cache sync in unconventional way. 264 1.90 jakllsch * However, unlike some other devices listed in this table, 265 1.90 jakllsch * this is does not cause the device firmware to stop responding. 266 1.90 jakllsch */ 267 1.90 jakllsch { { USB_VENDOR_SANDISK, USB_PRODUCT_SANDISK_SANSA_CLIP }, 268 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 269 1.90 jakllsch 0, 270 1.90 jakllsch PQUIRK_NOSYNCCACHE, 271 1.90 jakllsch UMATCH_VENDOR_PRODUCT, 272 1.90 jakllsch NULL, NULL 273 1.90 jakllsch }, 274 1.90 jakllsch 275 1.82 sborrill /* Kingston USB pendrives don't like being told to lock the door */ 276 1.88 asau { { USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_DT101_II }, 277 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 278 1.88 asau 0, 279 1.88 asau PQUIRK_NODOORLOCK, 280 1.88 asau UMATCH_VENDOR_PRODUCT, 281 1.88 asau NULL, NULL 282 1.88 asau }, 283 1.88 asau 284 1.88 asau { { USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_DT101_G2 }, 285 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 286 1.88 asau 0, 287 1.88 asau PQUIRK_NODOORLOCK, 288 1.88 asau UMATCH_VENDOR_PRODUCT, 289 1.88 asau NULL, NULL 290 1.88 asau }, 291 1.88 asau 292 1.89 plunky { { USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_DT102_G2 }, 293 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 294 1.89 plunky 0, 295 1.89 plunky PQUIRK_NODOORLOCK, 296 1.89 plunky UMATCH_VENDOR_PRODUCT, 297 1.89 plunky NULL, NULL 298 1.89 plunky }, 299 1.89 plunky 300 1.82 sborrill { { USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_DTMINI10 }, 301 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 302 1.82 sborrill 0, 303 1.82 sborrill PQUIRK_NODOORLOCK, 304 1.82 sborrill UMATCH_VENDOR_PRODUCT, 305 1.82 sborrill NULL, NULL 306 1.82 sborrill }, 307 1.84 jakllsch 308 1.93 riz /* Also, some Kingston pendrives have Toshiba vendor ID */ 309 1.93 riz { { USB_VENDOR_TOSHIBA, USB_PRODUCT_KINGSTON_DT100_G2 }, 310 1.97 skrll UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 311 1.93 riz 0, 312 1.93 riz PQUIRK_NODOORLOCK, 313 1.93 riz UMATCH_VENDOR_PRODUCT, 314 1.93 riz NULL, NULL 315 1.93 riz }, 316 1.93 riz 317 1.84 jakllsch /* HP USB pendrives don't like being told to lock the door */ 318 1.84 jakllsch { { USB_VENDOR_HP, USB_PRODUCT_HP_V125W }, 319 1.84 jakllsch UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 320 1.84 jakllsch 0, 321 1.84 jakllsch PQUIRK_NODOORLOCK, 322 1.84 jakllsch UMATCH_VENDOR_PRODUCT, 323 1.84 jakllsch NULL, NULL 324 1.84 jakllsch }, 325 1.95 kiyohara 326 1.95 kiyohara { { USB_VENDOR_IODATA2, USB_PRODUCT_IODATA2_USB2SC }, 327 1.95 kiyohara UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 328 1.95 kiyohara 0, 329 1.95 kiyohara 0, 330 1.95 kiyohara UMATCH_VENDOR_PRODUCT, 331 1.95 kiyohara NULL, NULL 332 1.95 kiyohara }, 333 1.102 flxd 334 1.102 flxd /* 335 1.102 flxd * Fix Alcor multi-card readers in many HP machines (like net-tops). 336 1.102 flxd * FreeBSD applies the no-sync-cache quirk for /all/ Alcor usb devices 337 1.102 flxd * as well as a no-test-unit-ready quirk. Mine works without the latter. 338 1.102 flxd */ 339 1.102 flxd { { USB_VENDOR_ALCOR, USB_PRODUCT_ALCOR_AU6366 }, 340 1.102 flxd UMASS_WPROTO_UNSPEC, UMASS_CPROTO_UNSPEC, 341 1.102 flxd 0, 342 1.102 flxd PQUIRK_NOSYNCCACHE, 343 1.102 flxd UMATCH_VENDOR_PRODUCT, 344 1.102 flxd NULL, NULL 345 1.102 flxd }, 346 1.1 gehenna }; 347 1.1 gehenna 348 1.1 gehenna const struct umass_quirk * 349 1.97 skrll umass_lookup(uint16_t vendor, uint16_t product) 350 1.1 gehenna { 351 1.97 skrll return (const struct umass_quirk *) 352 1.97 skrll usb_lookup(umass_quirks, vendor, product); 353 1.1 gehenna } 354 1.1 gehenna 355 1.1 gehenna Static usbd_status 356 1.1 gehenna umass_init_insystem(struct umass_softc *sc) 357 1.1 gehenna { 358 1.99 skrll UMASSHIST_FUNC(); UMASSHIST_CALLED(); 359 1.1 gehenna usbd_status err; 360 1.1 gehenna 361 1.1 gehenna err = usbd_set_interface(sc->sc_iface, 1); 362 1.1 gehenna if (err) { 363 1.100 pgoyette DPRINTFM(UDMASS_USB, "sc %#jx: could not switch to Alt " 364 1.100 pgoyette "Interface 1", (uintptr_t)sc, 0, 0, 0); 365 1.97 skrll return err; 366 1.1 gehenna } 367 1.1 gehenna 368 1.97 skrll return USBD_NORMAL_COMPLETION; 369 1.1 gehenna } 370 1.1 gehenna 371 1.1 gehenna Static usbd_status 372 1.1 gehenna umass_init_shuttle(struct umass_softc *sc) 373 1.1 gehenna { 374 1.1 gehenna usb_device_request_t req; 375 1.97 skrll uint8_t status[2]; 376 1.1 gehenna 377 1.1 gehenna /* The Linux driver does this */ 378 1.1 gehenna req.bmRequestType = UT_READ_VENDOR_DEVICE; 379 1.1 gehenna req.bRequest = 1; 380 1.1 gehenna USETW(req.wValue, 0); 381 1.1 gehenna USETW(req.wIndex, sc->sc_ifaceno); 382 1.1 gehenna USETW(req.wLength, sizeof(status)); 383 1.1 gehenna 384 1.97 skrll return usbd_do_request(sc->sc_udev, &req, &status); 385 1.25 cjs } 386 1.25 cjs 387 1.25 cjs Static void 388 1.25 cjs umass_fixup_sony(struct umass_softc *sc) 389 1.25 cjs { 390 1.25 cjs usb_interface_descriptor_t *id; 391 1.25 cjs 392 1.25 cjs id = usbd_get_interface_descriptor(sc->sc_iface); 393 1.53 mycroft if (id->bInterfaceSubClass == 0xff) 394 1.71 christos sc->sc_cmd = UMASS_CPROTO_RBC; 395 1.1 gehenna } 396