From owner-freebsd-usb@FreeBSD.ORG Sun Dec 16 01:30:01 2012 Return-Path: Delivered-To: freebsd-usb@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 9A478BAA for ; Sun, 16 Dec 2012 01:30:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 6DF058FC15 for ; Sun, 16 Dec 2012 01:30:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qBG1U1Wh016529 for ; Sun, 16 Dec 2012 01:30:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qBG1U1SF016528; Sun, 16 Dec 2012 01:30:01 GMT (envelope-from gnats) Resent-Date: Sun, 16 Dec 2012 01:30:01 GMT Resent-Message-Id: <201212160130.qBG1U1SF016528@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-usb@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Chris H Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C2DEEA85 for ; Sun, 16 Dec 2012 01:26:53 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id A02478FC13 for ; Sun, 16 Dec 2012 01:26:53 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.5/8.14.5) with ESMTP id qBG1QrgU075289 for ; Sun, 16 Dec 2012 01:26:53 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.5/8.14.5/Submit) id qBG1Qrba075288; Sun, 16 Dec 2012 01:26:53 GMT (envelope-from nobody) Message-Id: <201212160126.qBG1Qrba075288@red.freebsd.org> Date: Sun, 16 Dec 2012 01:26:53 GMT From: Chris H To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Subject: usb/174464: clone MAC address(es) on usb networks cdce(4) && ue[0-9] -- no documentation (solution provided) X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 Dec 2012 01:30:01 -0000 >Number: 174464 >Category: usb >Synopsis: clone MAC address(es) on usb networks cdce(4) && ue[0-9] -- no documentation (solution provided) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-usb >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Sun Dec 16 01:30:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Chris H >Release: RELENG_8 and RELENG_9 >Organization: >Environment: 8.3-STABLE/1386 9.0-STABLE/i386 >Description: I am evaluating a new ISP. The modem they provide has 2 ethernet ports -- one of which is USB. The modem caches the first device attached, and as a result, given that BSD creates random (fake) a MAC address for the USB port, I had to find a way to maintain a "fixed" MAC, that was the same as the one I used when installing FreeBSD from a net-install CD. Linux provides a "clone MAC" option in their Network Management. I had expected to find it in BSD. But my experiences were pretty dismal. I was unable to accomplish my need via any means of RC(8). It was possible manually, via a CLI. So I scoured the net, BSD forums, handbook. All without joy. So I subscribed to the net@ mailing list. While presented with several suggestions. None were fruitful. So, determined, I worked with both RELENG_8 && RELENG_9. Installing one, or the other, and experimenting until I could successfully get connected to the internet with the correct stanza's in rc.conf(5). I finally figured out how to make it always work (with DHCP, or STATIC IP). given there is no documentation on this. I'd like to present it here, so that it might make it to the handbook/man page. >How-To-Repeat: attempt to keep the same MAC address when using usb ethernet >Fix: **** ORDER IS IMPORTANT **** --- begin rc,conf -------------------------------------------------------------- ifconfig_ue0="ether ##:##:##:##:##:##" ifconfig_ue0_alias0="DHCP" *** or *** ifconfig_ue0_alias0="inet ip4.add.ress.anticipated netmask kno.wn.net.mask" followed by defaultrouter="kno.wn.gate.way" --applies only if using static IPv4 --- end rc,conf -------------------------------------------------------------- >Release-Note: >Audit-Trail: >Unformatted: From owner-freebsd-usb@FreeBSD.ORG Mon Dec 17 11:06:53 2012 Return-Path: Delivered-To: freebsd-usb@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 51A279FE for ; Mon, 17 Dec 2012 11:06:53 +0000 (UTC) (envelope-from owner-bugmaster@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 34BB08FC17 for ; Mon, 17 Dec 2012 11:06:53 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qBHB6rSX023641 for ; Mon, 17 Dec 2012 11:06:53 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qBHB6qKR023639 for freebsd-usb@FreeBSD.org; Mon, 17 Dec 2012 11:06:52 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 17 Dec 2012 11:06:52 GMT Message-Id: <201212171106.qBHB6qKR023639@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: gnats set sender to owner-bugmaster@FreeBSD.org using -f From: FreeBSD bugmaster To: freebsd-usb@FreeBSD.org Subject: Current problem reports assigned to freebsd-usb@FreeBSD.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Dec 2012 11:06:53 -0000 Note: to view an individual PR, use: http://www.freebsd.org/cgi/query-pr.cgi?pr=(number). The following is a listing of current problems submitted by FreeBSD users. These represent problem reports covering all versions including experimental development code and obsolete releases. S Tracker Resp. Description -------------------------------------------------------------------------------- o usb/174464 usb clone MAC address(es) on usb networks cdce(4) && ue[0- o usb/174254 usb MIDI keyboard not recognised o usb/173722 usb XHCI driver bug after suspend to ram (ACPI S3 mode) o usb/173666 usb [usb] [libusb] usb_reset() behavior different between o usb/173616 usb LG USB DVD-RW USB STALL o usb/173503 usb Add IDs for Huawei K3770 and K4507 o usb/173182 usb usbus appears as a network device o usb/172937 usb FreeBSD 9.1-RC2 usb3 port disconnects o usb/172633 usb Sony Cybershot not recognized as USB mem stick o usb/172199 usb high interrupts load xhci o usb/171354 usb [umass] Medium not present error on flash drive [regre o usb/171262 usb plug in sdhc via usb reader reboots machine o usb/171197 usb ADATA Classic CH11 USB HDD doesn't work in FreeBSD 9.1 o usb/170699 usb FreeBSD 9.0 Doesn't list HDD or its partitions in part o usb/170688 usb patch][usbdevs][wlan] Patch for ASUS Black Diamond USB o usb/170606 usb r239222 kernel panic at boot - usb locking issue o usb/170358 usb [ums] Wrong (duplicate) button numbers o usb/170123 usb [umass] HP v210w USB stick not supported o usb/169935 usb [keyboard] Unable use USB keyboard while panic o usb/169789 usb [u3g] [patch] add support for huawei e3131 o usb/169461 usb [ugen] USB2 high-speed device detected as full speed o usb/169428 usb [ugen] ugen not detecting all endpoints on device [reg o usb/168551 usb [umass] Issues with embedded card reader (Laptop ASUS o usb/168132 usb [umass] MATSHITA memory card size reported wrong, moun o usb/167847 usb [ural] dlink dwl-122g e crashes(?) when trying wap2 cr o usb/167001 usb [USB] [PATCH] add support for Smart G2 64MB memory key o usb/165815 usb [usbdevs] [patch] add k3772z 3g modem support o usb/165163 usb [keyboard] The USB RF keyboard and mouse become non-re o usb/164058 usb [umass] Lexar 8GB USB flash drive doesn't work by defa f usb/163328 usb [usb] Support for Atheros USB abgn devices o kern/163091 usb [panic] Fatal trap 12: page fault while in kernel mode f usb/162306 usb usb devices cant get address asignation, no memories, o usb/162054 usb usbdump just hangs on 9.0-RC1 f usb/161793 usb poor EHCI usb2 i/o performance o usb/160436 usb ucom wedges machine on parity error ? o usb/160299 usb MicroSDHC-to-USB adapters do not work in FreeBSD 8.x o usb/160192 usb [install] Installation from USB-Stick doesn't find the o usb/159274 usb USB 3.0 Etron EJ168A does not work. f usb/159191 usb [fusefs-ntfs] write on fusefs-ntfs mounted partition r o usb/157376 usb LaCie USB disk not recognized o usb/157074 usb [boot] [usb8] vfs_mountroot_ask is called when no usb o usb/156898 usb [keyboard] usb keyboard does not work while boot (ps2 f usb/156735 usb Need Quirk for Goflex USB Disk Drives o usb/156726 usb [snd_uaudio]: snd_uaudio(4) fails to detach when mixer o usb/156725 usb USB stack stall cause complete system input loss o usb/156596 usb [ehci] Extremely high interrupt rate on ehci/uhci IRQ1 o usb/156000 usb rum(4) Fatal trap 18: integer divide fault while in ke f usb/155996 usb NanoBSD not booted as Disk o usb/155784 usb Problem with Transcend StoreJet 25M3 (2AJ1) on Asus M2 o usb/155663 usb [usbdevs] [patch] Add support for Supertop Nano 1GB US o usb/154753 usb [usbdevs] [patch] Support for Qualcomm USB modem/stora o usb/154506 usb [umass] Copying dir with large files makes FreeBSD loa o usb/154192 usb [umass] In Garmin Oregon GPS, only the first umass dev o i386/153851 usb [keyboard] keyboard issues on new Intel Mother boards. o usb/153703 usb [keyboard] My USB keyboard can not be used in 8-STABLE o usb/153609 usb [zyd] [panic] kernel: Fatal trap 12: page fault while o usb/153149 usb [umass] USB stick quirk regression [regression] o usb/152075 usb [usb8] [ehci] [request] Add quirk for CS5536 USB o usb/150892 usb [zyd] Whenever network contacted in any shape, way or o usb/150189 usb [run] [usb8] [patch] if_run appears to corrupt IP traf p usb/149764 usb [u3g] [patch] usbdevs update: Huawei K3765 3G modem o usb/149283 usb [uftdi] avrdude unable to talk to Arduino board (via u o usb/149162 usb [ural] ASUS WL-167g doesn't work in 8.1 (continue of 1 s usb/148702 usb [usb8] [request] IO DATA USB-RSAQ5 support on FreeBSD- o usb/148080 usb usbconfig(8) sometimes does not turn off the device o i386/147475 usb [install] FreeBSD 8.x does not install on ASUS K8N4-E o usb/146840 usb [hang] FreeBSD 7.2 / 7.3 / 8.0 hang at startup after e o usb/146153 usb [axe] [usb8] Hosts in network doesn't receive any pack f usb/146054 usb [urtw] [usb8] urtw driver potentially out of date f usb/145513 usb [usb8] New USB stack: no new devices after forced usb p usb/145455 usb [usb8] [patch] USB debug support cannot be disabled o usb/145415 usb [umass] [usb8] USB card reader does not create slices a usb/145184 usb GENERIC can't mount root from USB on Asus EEE o usb/145165 usb [keyboard] [usb8] ukbd_set_leds_callback: error=USB_ER f kern/144938 usb [keyboard] [boot] Boot Failure with Apple (MB869LL/A) o usb/144387 usb [run] [panic] if_run panic o usb/144043 usb [umass] [usb8] USB DLT tape drive throws random errors a usb/143790 usb [boot] [cam] can not boot from usb hdd f usb/143620 usb [cdce] [usb8] the module if_cdce doesn't support my Op f usb/143294 usb [usb8] copying process stops at some time (10 - 50 sec o usb/143286 usb [ukbd] [usb8] [boot] boot failures on RELENG_8 system p usb/143186 usb [usbdevs] [usb8] [patch] add USB device IDs for Google a usb/143139 usb [umass] [usb8] [patch] Quirk for Century EX35SW4_SB4 J p usb/143045 usb [umass] [usb8] [patch] mounting Fujitsu 2600Z camera d f usb/142989 usb [usb8] canon eos 50D attaches but detaches after few s f usb/142957 usb [umass] [usb8] [patch] patch for USB disk SYNCHRONIZE o usb/142719 usb [urtw] [usb8] AirLive WL-1600USB (RTL8187L chipset) fa f usb/142276 usb [umass] [usb8] Cache Synchronization Error with Olympu o usb/142229 usb [ums] [usb8] [hang] connecting a USB mouse to a Dell P f usb/141680 usb [uath] [usb8] Netgear WG111T not working with uath dri o usb/141664 usb [pcm] [usb8] Logitech USB microphone failure [regressi o usb/141474 usb [boot] [usb8] FreeBSD 8.0 can not install from USB CDR o usb/141212 usb [ukbd] [usb8] ukbd_set_leds_callback:700: error=USB_ER o kern/141011 usb [usb8] Encrypted root, geli password at boot; enter ke o usb/140920 usb [install] [usb8] USB based install fails on 8.0-RELEAS o usb/140893 usb [urtw] [usb8] WPA2 not working on rtl8187b o kern/140849 usb [ums] [usb8] USB mouse doesn't work under FreeBSD 8.0- a usb/140810 usb [uftdi] [usb8] 8.X copy and paste problem / tty overfl o usb/140477 usb [umass] [usb8] [patch] allow boot-time attachment of d o usb/140236 usb [msdosfs] [usb8] Labels wiped on external Journaled US o usb/140160 usb [usb8] [acpi] USB ports are no longer "active" after A o usb/138798 usb [boot] [usb8] 8.0-BETA4 can't boot from USB flash driv o usb/138659 usb [usb8][uftdi] driver broken in RELENG_8/CURRENT o usb/138124 usb [snd_uaudio] [usb8] Axed uaudio functionality in the u o usb/137377 usb [usb8] request support for Huawei E180 o usb/137341 usb [usb8][rum] driver if_rum doesn't work at all and thro f usb/137190 usb [usb8][patch] inhibit spurious button releases for som o usb/137189 usb [usb8][patch] create and use sysctl nodes for HID repo p usb/137188 usb [usb8][patch] correctly handle USB report descriptors o usb/137129 usb [ums] [usb8] SteelSeries Ikari USB laser mouse not att o usb/135542 usb [keyboard] boot loader does not work with a usb keyboa o usb/135206 usb machine reboots when inserted USB device f usb/135200 usb SAMSUNG i740 usb mass: Synchronize cache failed, statu o usb/134950 usb Lowering DTR for USB-modem via ubsa is not possible o usb/134299 usb Kernel Panic plugging in MF626 USB UMTS Stick u3g o usb/134193 usb System freeze on usb MP3 player insertion o usb/134085 usb [umass] [patch] Adding usb quirk for Sony USB flash dr o usb/133989 usb [usb8] [ukbd] USB keyboard dead at mountroot> prompt o usb/133712 usb [ural] [patch] RE: Fixed an issue with ural(4) that wa o usb/133390 usb umass crashes system in 7.1 when Olympus D-540 attache o usb/133296 usb [rum] driver not working properly in hostap mode o usb/132594 usb USB subsystem causes page fault and crashes o usb/132080 usb [patch] [usb] [rum] [panic] Kernel panic after NOMEM c o usb/132066 usb [ukbd] Keyboard failure USB keyboard DELL 760 o usb/132036 usb [panic] page fault when connecting Olympus C740 camera o usb/131583 usb [umass] Failure when detaching umass Device o usb/131576 usb [aue] ADMtek USB To LAN Converter can't send data o usb/131521 usb Registering Belkin UPS to usb_quirks.c o usb/131074 usb no run-time detection of usb devices plugged into exte o usb/130736 usb Page fault unplugging USB stick o usb/130208 usb Boot process severely hampered by umass0 error o usb/130122 usb [usb8] DVD drive detects as 'da' device f usb/129766 usb [usb] [panic] plugging in usb modem HUAWEI E226 panics o usb/129500 usb [umass] [panic] FreeBSD Crashes when connecting SanDis o usb/129311 usb [usb] [panic] Instant crash with an USB card reader o usb/128485 usb [umodem] [patch] Nokia N80 modem support o usb/128425 usb [umass] Cannot Connect Maxtor Onetouch 4 USB drive o usb/128418 usb [panic] [rum] loading if_rum causes panic, looks like o usb/127926 usb [boot] USB Timeout during bootup o usb/127342 usb [boot] [panic] enabling usb keyboard and mouse support o usb/127248 usb [ucom] panic while uplcom devices attach and detach o usb/126884 usb [ugen] [patch] Bug in buffer handling in ugen.c o usb/126848 usb [usb]: USB Keyboard hangs during Installation o usb/126740 usb [ulpt] doesn't work on 7.0-RELEASE, 10 second stall be o usb/126519 usb [usb] [panic] panic when plugging in an iphone o kern/126396 usb [panic] kernel panic after unplug USB Bluetooth device o usb/125631 usb [ums] [panic] kernel panic during bootup while 'Logite o usb/125510 usb [panic] repeated plug and unplug of USB mass storage d f usb/125450 usb [panic] Removing USB flash card while being accessed c o usb/125088 usb [keyboard] Touchpad not detected on Adesso AKB-430UG U o usb/124980 usb [panic] kernel panic on detaching unmounted umass devi o kern/124777 usb [ucom] USB cua devices don't revert to tty devices whe o usb/124758 usb [rum] [panic] rum panics SMP kernel o usb/124708 usb [panic] Kernel panic on USB KVM reattach o kern/124130 usb [usb] gmirror fails to start usb devices that were pre o usb/123969 usb [usb] Supermicro H8SMi-2 usb problem: port reset faile o usb/123714 usb [usb] [panic] Panic when hald-storage-probe runs with o usb/123691 usb usbd(8): usbd hangs o usb/123690 usb [usb] [panic] Panic on USB device insertion when usb l o usb/123611 usb [usb] BBB reset failed, STALLED from Imation/Mitsumi U o usb/122992 usb [umass] [patch] MotoROKR Z6 Phone not recognised by um o usb/122936 usb [ucom] [ubsa] Device does not receive interrupt o usb/122905 usb [ubsa] [patch] add Huawei E220 to ubsa o usb/122547 usb [ehci] USB Printer not being recognized after reboot o usb/122539 usb [ohci] [panic] AnyDATA ADU-E1000D - kernel panic: ohci o usb/122483 usb [panic] [ulpt] Repeatable panic in 7.0-STABLE o usb/122119 usb [umass] umass device causes creation of daX but not da o usb/121734 usb [ugen] ugen HP1022 printer device not working since up o usb/121708 usb [keyboard] nforce 650i mobo w/ usb keyboard infinite k o usb/121275 usb [boot] [panic] FreeBSD fails to boot with usb legacy s o usb/121169 usb [umass] Issues with usb mp3 player o usb/121045 usb [uftdi] [patch] Add support for PC-OP-RS1 and KURO-RS f usb/120786 usb [usb] [panic] Kernel panic when forced umount of a det o usb/120729 usb [panic] fault while in kernel mode with connecting USB o conf/120406 usb [devd] [patch] Handle newly attached pcm devices (eg. o usb/120321 usb [hang] System hangs when transferring data to WD MyBoo o usb/120283 usb [panic] Automation reboot with wireless keyboard & mou o usb/120034 usb [hang] 6.2 & 6.3 hangs on boot at usb0: OHCI with 1.5 o usb/119977 usb [ums] Mouse does not work in a Cherry-USB keyboard/mou o usb/119653 usb [cam] [patch] iriver s7 player sync cache error patch o usb/119633 usb [umass] umass0: BBB reset failed, IOERROR [regression] o usb/119509 usb [usb] USB flaky on Dell Optiplex 755 o usb/119389 usb [umass] Sony DSC-W1 CBI reset failed, STALLED [regress o usb/119227 usb [ubsa] [patch] ubsa buffer is too small; should be tun o usb/118480 usb [umass] Timeout in USB mass storage freezes vfs layer o usb/118353 usb [panic] [ppp] repeatable kernel panic during ppp(4) se o usb/118141 usb [ucom] usb serial and nokia phones ucomreadcb ucomread o usb/118140 usb [ucom] [patch] quick hack for ucom to get it behave wi o usb/118098 usb [umass] 6th gen iPod causes problems when disconnectin o usb/117955 usb [umass] [panic] inserting minolta dimage a2 crashes OS o usb/117946 usb [panic] D-Link DUB-E100 rev. B1 crashes FreeBSD 7.0-BE o usb/117938 usb [ums] [patch] Adding support for MS WL Natural and MS o usb/117911 usb [ums] [request] Mouse Gembird MUSWC not work o usb/117893 usb [umass] Lacie USB DVD writing failing o usb/117613 usb [uhci] [irq] uhci interrupt storm & USB leaked memory o usb/117598 usb [snd_uaudio] [patch] Not possible to record with Plant o usb/117313 usb [umass] [panic] panic on usb camera insertion o usb/117183 usb [panic] USB/fusefs -- panic while transferring large a o usb/116561 usb [umodem] [panic] RELENG_6 umodem panic "trying to slee o usb/116282 usb [ulpt] Cannot print on USB HP LJ1018 or LJ1300 o usb/115935 usb [usbdevs] [patch] kernel counterproductively attaches o usb/115400 usb [ehci] Problem with EHCI on ASUS M2N4-SLI o usb/115298 usb [ulpt] [panic] Turning off USB printer panics kernel o usb/114916 usb [umass] [patch] USB Maxtor drive (L300RO) requires qui o kern/114780 usb [uplcom] [panic] Panics while stress testing the uplco o usb/114682 usb [umass] generic USB media-card reader unusable o usb/114310 usb [libusb] [patch] [panic] USB hub attachment panics ker o conf/114013 usb [patch] WITHOUT_USB allow to compil a lot of USB stuff o usb/99431 usb [keyboard] FreeBSD on MSI 6566E (Intel 845E motherboar o usb/98343 usb [boot] BBB reset failed errors with Creative Muvo MP3 o usb/97472 usb [cam] [patch] add support for Olympus C150,D390 s usb/97286 usb [mouse] [request] MS Wireless Intellimouse Explorer 2. o usb/97175 usb [umass] [hang] USB cardreader hangs system o usb/96457 usb [umass] [panic] fatback on umass = reboot o usb/96224 usb [usb] [msdosfs] mount_msdosfs cause page fault in sync s usb/96120 usb [ums] [request] USB mouse not always detected s usb/95636 usb [umass] [boot] 5 minute delay at boot when using VT620 o usb/95562 usb [umass] Write Stress in USB Mass drive causes "vinvalb o usb/95037 usb [umass] USB disk not recognized on hot-plug. o usb/94897 usb [panic] Kernel Panic when cleanly unmounting USB disk o usb/94717 usb [ulpt] Reading from /dev/ulpt can break work of a UHCI o usb/94384 usb [panic] kernel panic with usb2 hardware o usb/93828 usb [ohci] [panic] ohci causes panic on boot (HP Pavillion o usb/93389 usb [umass] [patch] Digital Camera Pentax S60 don't work o usb/92852 usb [ums] [patch] Vertical scroll not working properly on o usb/92171 usb [panic] panic unplugging Vodafone Mobile Connect (UMTS o usb/92142 usb [uhub] SET_ADDR_FAILED and SHORT_XFER errors from usb o usb/92083 usb [ural] [panic] panic using WPA on ural NIC in 6.0-RELE o usb/92052 usb [ulpt] usbd causes defunct process with busy file-hand o usb/91906 usb [ehci] [hang] FreeBSD hangs while booting with USB leg f usb/91896 usb camcontrol(8): Serial Number of USB Memory Sticks is n o usb/91811 usb [umass] Compact Flash in HP Photosmart 2610 return " o usb/91546 usb [umodem] [patch] Nokia 6630 mobile phone does not work o usb/91538 usb [ulpt] [patch] Unable to print to EPSON CX3500 o usb/91283 usb [boot] [regression] booting very slow with usb devices o usb/91238 usb [umass] USB tape unit fails to write a second tape fil o usb/90700 usb [umass] [panic] Kernel panic on connect/mount/use umas o usb/89954 usb [umass] [panic] USB Disk driver race condition? o usb/88743 usb [hang] [regression] USB makes kernel hang at boot (reg o usb/88408 usb [axe] axe0 read PHY failed o usb/87648 usb [mouse] Logitech USB-optical mouse problem. f usb/87224 usb [usb] Cannot mount USB Zip750 o usb/86767 usb [umass] [patch] bogus "slice starts beyond end of the o usb/86298 usb [mouse] Known good USB mouse won't work with correct s s usb/85067 usb [uscanner] Cannot attach ScanJet 4300C to usb device o usb/83977 usb [ucom] [panic] ucom1: open bulk out error (addr 2): IN o usb/83863 usb [ugen] Communication problem between opensc/openct via o usb/83756 usb [ums] [patch] Microsoft Intellimouse Explorer 4.0A doe o usb/83504 usb [kernel] [patch] SpeedTouch USB stop working on recent o usb/82520 usb [udbp] [reboot] Reboot when USL101 connected o usb/82350 usb [ucom] [panic] null pointer dereference in USB stack o usb/81621 usb [ehci] [hang] external hd hangs under load on ehci o usb/80935 usb [uvisor] [patch] uvisor.c is not work with CLIE TH55. s usb/80777 usb [request] usb_rem_task() should wait for callback to c s usb/80776 usb [udav] [request] UDAV device driver shouldn't use usb_ o usb/80774 usb [patch] have "usbd_find_desc" in line with the other " o usb/80361 usb [umass] [patch] mounting of Dell usb-stick fails f usb/80040 usb [sound] [hang] Use of sound mixer causes system freeze o usb/79723 usb [usb] [request] prepare for high speed isochronous tra o usb/78984 usb [umass] [patch] Creative MUVO umass failure o usb/76653 usb [umass] [patch] Problem with Asahi Optical usb device s usb/75928 usb [umass] [request] Cytronix SmartMedia card (SMC) reade o usb/75800 usb [ucom] ucom1: init failed STALLED error in time of syn o usb/75764 usb [umass] [patch] "umass0: Phase Error" - no device for s usb/74453 usb [umass] [patch] Q-lity CD-RW USB ECW-043 (ScanLogic SL o usb/74211 usb [umass] USB flash drive causes CAM status 0x4 on 4.10R o usb/71417 usb [ugen] Cryptoflex e-gate USB token (ugen0) communicati o usb/71416 usb [ugen] Cryptoflex e-gate USB token (ugen0) detach is n o usb/71280 usb [aue] aue0 device (linksys usb100tx) doesn't work in 1 o usb/71155 usb [ulpt] misbehaving usb-printer hangs processes, causes o usb/69006 usb [usbdevs] [patch] Apple Cinema Display hangs USB ports o usb/67301 usb [uftdi] [panic] RTS and system panic o usb/66547 usb [ucom] Palm Tungsten T USB does not initialize correct o usb/63621 usb [umass] [panic] USB MemoryStick Reader stalls/crashes s usb/62257 usb [umass] [request] card reader UCR-61S2B is only half-s s usb/52026 usb [usb] [request] umass driver support for InSystem ISD2 s usb/51958 usb [urio] [patch] update for urio driver o usb/40948 usb [umass] [request] USB HP CDW8200 does not work o usb/30929 usb [usb] [patch] use usbd to initialize USB ADSL modem 279 problems total. From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 07:49:54 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B4BBFB9D; Tue, 18 Dec 2012 07:49:54 +0000 (UTC) (envelope-from andrew@fubar.geek.nz) Received: from smtp5.clear.net.nz (smtp5.clear.net.nz [203.97.33.68]) by mx1.freebsd.org (Postfix) with ESMTP id 7A1578FC1F; Tue, 18 Dec 2012 07:49:54 +0000 (UTC) Received: from mxin1-orange.clear.net.nz (lb2-srcnat.clear.net.nz [203.97.32.237]) by smtp5.clear.net.nz (CLEAR Net Mail) with ESMTP id <0MF700A8QV2X1760@smtp5.clear.net.nz>; Tue, 18 Dec 2012 20:49:46 +1300 (NZDT) Received: from 202-0-48-19.paradise.net.nz (HELO localhost) ([202.0.48.19]) by smtpin1.paradise.net.nz with ESMTP; Tue, 18 Dec 2012 20:49:45 +1300 Date: Tue, 18 Dec 2012 20:49:31 +1300 From: Andrew Turner Subject: EHCI on armv6 with Write-Back caches To: freebsd-usb@freebsd.org Message-id: <20121218204931.5322922d@fubar.geek.nz> MIME-version: 1.0 X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.6; i386-portbld-freebsd8.1) Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Pirate: Arrrr Cc: Oleksandr Tymoshenko X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 07:49:54 -0000 Hello, Oleksandr and myself have been looking into why when we enable the write-back cache on the PandaBoard there are kernel panics with USB. We have tracked it down to an issue appending the ehci_qh_t to the list at the end of ehci_setup_standard_chain(). I have a patch at [1] that allows me to run sha256 on a 40MB file over NSF using the built in smsc USB ethernet chip. The problem is I have had to place a call to DELAY before EHCI_APPEND_QH. This is obviously not the correct solution. Is anyone able to help me narrow down what is missing? It appears to be a missing cache invalidate or flush somewhere but I haven't been able to track down what cache function the DELAY is working around. Andrew [1] http://fubar.geek.nz/files/freebsd/ehci_4.diff From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 08:20:53 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C26745DD; Tue, 18 Dec 2012 08:20:53 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe05.c2i.net [212.247.154.130]) by mx1.freebsd.org (Postfix) with ESMTP id 15B2D8FC0C; Tue, 18 Dec 2012 08:20:52 +0000 (UTC) X-T2-Spam-Status: No, hits=-1.0 required=5.0 tests=ALL_TRUSTED Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe05.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 354972685; Tue, 18 Dec 2012 09:20:44 +0100 From: Hans Petter Selasky To: Andrew Turner Subject: Re: EHCI on armv6 with Write-Back caches Date: Tue, 18 Dec 2012 09:22:22 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> In-Reply-To: <20121218204931.5322922d@fubar.geek.nz> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212180922.22217.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 08:20:53 -0000 On Tuesday 18 December 2012 08:49:31 Andrew Turner wrote: > Hello, > > Oleksandr and myself have been looking into why when we enable the > write-back cache on the PandaBoard there are kernel panics with USB. We > have tracked it down to an issue appending the ehci_qh_t to the list at > the end of ehci_setup_standard_chain(). > > I have a patch at [1] that allows me to run sha256 on a 40MB file over > NSF using the built in smsc USB ethernet chip. The problem is I have > had to place a call to DELAY before EHCI_APPEND_QH. This is obviously > not the correct solution. > > Is anyone able to help me narrow down what is missing? It appears to be > a missing cache invalidate or flush somewhere but I haven't been able > to track down what cache function the DELAY is working around. > > Andrew > > [1] http://fubar.geek.nz/files/freebsd/ehci_4.diff Hi, Can you dump the DMA tag belonging to the QH via and check wether it is mapped coherent or not. Thes QH- and TD- structures should not be cache mapped. Else cache has not been disabled on those pages. qh->page_cache->tag --HPS From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 11:17:36 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6475A145; Tue, 18 Dec 2012 11:17:36 +0000 (UTC) (envelope-from andrew@fubar.geek.nz) Received: from smtp3.clear.net.nz (smtp3.clear.net.nz [203.97.33.64]) by mx1.freebsd.org (Postfix) with ESMTP id 20CF38FC14; Tue, 18 Dec 2012 11:17:34 +0000 (UTC) Received: from mxin3-orange.clear.net.nz (lb2-srcnat.clear.net.nz [203.97.32.237]) by smtp3.clear.net.nz (CLEAR Net Mail) with ESMTP id <0MF800AEP404MS00@smtp3.clear.net.nz>; Wed, 19 Dec 2012 00:02:28 +1300 (NZDT) Received: from 202-0-48-19.paradise.net.nz (HELO localhost) ([202.0.48.19]) by smtpin32.paradise.net.nz with ESMTP; Wed, 19 Dec 2012 00:02:27 +1300 Date: Wed, 19 Dec 2012 00:02:13 +1300 From: Andrew Turner Subject: Re: EHCI on armv6 with Write-Back caches In-reply-to: <201212180922.22217.hselasky@c2i.net> To: Hans Petter Selasky Message-id: <20121219000213.269b1371@fubar.geek.nz> MIME-version: 1.0 X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.6; i386-portbld-freebsd8.1) Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Pirate: Arrrr References: <20121218204931.5322922d@fubar.geek.nz> <201212180922.22217.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 11:17:36 -0000 On Tue, 18 Dec 2012 09:22:22 +0100 Hans Petter Selasky wrote: > On Tuesday 18 December 2012 08:49:31 Andrew Turner wrote: > > Hello, > > > > Oleksandr and myself have been looking into why when we enable the > > write-back cache on the PandaBoard there are kernel panics with > > USB. We have tracked it down to an issue appending the ehci_qh_t to > > the list at the end of ehci_setup_standard_chain(). > > > > I have a patch at [1] that allows me to run sha256 on a 40MB file > > over NSF using the built in smsc USB ethernet chip. The problem is > > I have had to place a call to DELAY before EHCI_APPEND_QH. This is > > obviously not the correct solution. > > > > Is anyone able to help me narrow down what is missing? It appears > > to be a missing cache invalidate or flush somewhere but I haven't > > been able to track down what cache function the DELAY is working > > around. > > > > Andrew > > > > [1] http://fubar.geek.nz/files/freebsd/ehci_4.diff > > Hi, > > Can you dump the DMA tag belonging to the QH via and check wether it > is mapped coherent or not. Thes QH- and TD- structures should not be > cache mapped. Else cache has not been disabled on those pages. > > qh->page_cache->tag The BUS_DMA_COHERENT flag does nothing on armv6 as we need the cache enabled for atomic operations to work correctly and we would have to disable the cache on the entire page. This is acceptable behaviour from the description of the flag in the busdma man page. Is there a reason the QH and TD structures shouldn't be cache mapped? Andrew From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 12:10:16 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 7AAEEDE6; Tue, 18 Dec 2012 12:10:16 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe06.c2i.net [212.247.154.162]) by mx1.freebsd.org (Postfix) with ESMTP id D1C848FC14; Tue, 18 Dec 2012 12:10:15 +0000 (UTC) X-T2-Spam-Status: No, hits=-1.0 required=5.0 tests=ALL_TRUSTED Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe06.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 358305837; Tue, 18 Dec 2012 13:05:06 +0100 From: Hans Petter Selasky To: Andrew Turner Subject: Re: EHCI on armv6 with Write-Back caches Date: Tue, 18 Dec 2012 13:06:44 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212180922.22217.hselasky@c2i.net> <20121219000213.269b1371@fubar.geek.nz> In-Reply-To: <20121219000213.269b1371@fubar.geek.nz> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212181306.44926.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 12:10:16 -0000 On Tuesday 18 December 2012 12:02:13 Andrew Turner wrote: > On Tue, 18 Dec 2012 09:22:22 +0100 > > Hans Petter Selasky wrote: > > On Tuesday 18 December 2012 08:49:31 Andrew Turner wrote: > > > Hello, > > > > > > Oleksandr and myself have been looking into why when we enable the > > > write-back cache on the PandaBoard there are kernel panics with > > > USB. We have tracked it down to an issue appending the ehci_qh_t to > > > the list at the end of ehci_setup_standard_chain(). > > > > > > I have a patch at [1] that allows me to run sha256 on a 40MB file > > > over NSF using the built in smsc USB ethernet chip. The problem is > > > I have had to place a call to DELAY before EHCI_APPEND_QH. This is > > > obviously not the correct solution. > > > > > > Is anyone able to help me narrow down what is missing? It appears > > > to be a missing cache invalidate or flush somewhere but I haven't > > > been able to track down what cache function the DELAY is working > > > around. > > > > > > Andrew > > > > > > [1] http://fubar.geek.nz/files/freebsd/ehci_4.diff > > > > Hi, > > > > Can you dump the DMA tag belonging to the QH via and check wether it > > is mapped coherent or not. Thes QH- and TD- structures should not be > > cache mapped. Else cache has not been disabled on those pages. > > > > qh->page_cache->tag > Hi Andrew, > The BUS_DMA_COHERENT flag does nothing on armv6 as we need the cache > enabled for atomic operations to work correctly and we would have to > disable the cache on the entire page. This is acceptable behaviour from > the description of the flag in the busdma man page. Yes, but when I allocate memory from the USB stack, then I want that memory to not be cached. It is simply not that useful to have that memory cached. I didn't check the latest state of busdma, but if I'm not mistaken, if the BUS_DMA_COHERENT flag is set on the DMA tag, the flush/invalidate will simply return and do nothing. Maybe that is the problem ... > > Is there a reason the QH and TD structures shouldn't be cache mapped? Because they are frequently used for setting up data operations, and the flush/invalidate operate on the whole page where multiple tags can be present, notably for the same USB transfer, under the same mutex. So it slows down everything. --HPS From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 19:22:03 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 3FB16B28; Tue, 18 Dec 2012 19:22:03 +0000 (UTC) (envelope-from andrew@fubar.geek.nz) Received: from smtp3.clear.net.nz (smtp3.clear.net.nz [203.97.33.64]) by mx1.freebsd.org (Postfix) with ESMTP id D72998FC8B; Tue, 18 Dec 2012 19:12:45 +0000 (UTC) Received: from mxin1-orange.clear.net.nz (lb2-srcnat.clear.net.nz [203.97.32.237]) by smtp3.clear.net.nz (CLEAR Net Mail) with ESMTP id <0MF800I1FQP2IM00@smtp3.clear.net.nz>; Wed, 19 Dec 2012 08:12:44 +1300 (NZDT) Received: from 202-0-48-19.paradise.net.nz (HELO localhost) ([202.0.48.19]) by smtpin1.paradise.net.nz with ESMTP; Wed, 19 Dec 2012 08:12:43 +1300 Date: Wed, 19 Dec 2012 08:12:29 +1300 From: Andrew Turner Subject: Re: EHCI on armv6 with Write-Back caches In-reply-to: <201212181306.44926.hselasky@c2i.net> To: Hans Petter Selasky Message-id: <20121219081229.383d9f41@fubar.geek.nz> MIME-version: 1.0 X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.6; i386-portbld-freebsd8.1) Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit X-Pirate: Arrrr References: <20121218204931.5322922d@fubar.geek.nz> <201212180922.22217.hselasky@c2i.net> <20121219000213.269b1371@fubar.geek.nz> <201212181306.44926.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 19:22:03 -0000 On Tue, 18 Dec 2012 13:06:44 +0100 Hans Petter Selasky wrote: > Hi Andrew, > > > The BUS_DMA_COHERENT flag does nothing on armv6 as we need the cache > > enabled for atomic operations to work correctly and we would have to > > disable the cache on the entire page. This is acceptable behaviour > > from the description of the flag in the busdma man page. > > Yes, but when I allocate memory from the USB stack, then I want that > memory to not be cached. It is simply not that useful to have that > memory cached. I didn't check the latest state of busdma, but if I'm > not mistaken, if the BUS_DMA_COHERENT flag is set on the DMA tag, the > flush/invalidate will simply return and do nothing. Maybe that is the > problem ... The exact meaning of BUS_DMA_COHERENT depends on the architecture. The code is still required to call bus_dmamap_sync with a coherent map but when the flag is implemented the cost of the operation will be reduced. It doesn't guarantee the memory is uncached, it may be implemented that way but the USB code can't rely on it. Andrew From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 19:47:42 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 55A291B5; Tue, 18 Dec 2012 19:47:42 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe09.c2i.net [212.247.155.2]) by mx1.freebsd.org (Postfix) with ESMTP id A959A8FC0A; Tue, 18 Dec 2012 19:47:41 +0000 (UTC) X-T2-Spam-Status: No, hits=-0.2 required=5.0 tests=ALL_TRUSTED, BAYES_50 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe09.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 185763534; Tue, 18 Dec 2012 20:42:33 +0100 From: Hans Petter Selasky To: Andrew Turner Subject: Re: EHCI on armv6 with Write-Back caches Date: Tue, 18 Dec 2012 20:44:11 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212181306.44926.hselasky@c2i.net> <20121219081229.383d9f41@fubar.geek.nz> In-Reply-To: <20121219081229.383d9f41@fubar.geek.nz> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212182044.11326.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 19:47:42 -0000 On Tuesday 18 December 2012 20:12:29 Andrew Turner wrote: > On Tue, 18 Dec 2012 13:06:44 +0100 > > Hans Petter Selasky wrote: > > Hi Andrew, > > > > > The BUS_DMA_COHERENT flag does nothing on armv6 as we need the cache > > > enabled for atomic operations to work correctly and we would have to > > > disable the cache on the entire page. This is acceptable behaviour > > > from the description of the flag in the busdma man page. > > > > Yes, but when I allocate memory from the USB stack, then I want that > > memory to not be cached. It is simply not that useful to have that > > memory cached. I didn't check the latest state of busdma, but if I'm > > not mistaken, if the BUS_DMA_COHERENT flag is set on the DMA tag, the > > flush/invalidate will simply return and do nothing. Maybe that is the > > problem ... > > The exact meaning of BUS_DMA_COHERENT depends on the architecture. The > code is still required to call bus_dmamap_sync with a coherent map but > when the flag is implemented the cost of the operation will be reduced. > It doesn't guarantee the memory is uncached, it may be implemented that > way but the USB code can't rely on it. > > Andrew The USB code doesn't rely on this flag. I'm wondering if BUSDMA by accident sets this flag, so that the cache sync ops are not called. --HPS From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 20:37:49 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 0BF72F0B for ; Tue, 18 Dec 2012 20:37:49 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from mail-ob0-f178.google.com (mail-ob0-f178.google.com [209.85.214.178]) by mx1.freebsd.org (Postfix) with ESMTP id B583C8FC12 for ; Tue, 18 Dec 2012 20:37:48 +0000 (UTC) Received: by mail-ob0-f178.google.com with SMTP id eh20so1130194obb.23 for ; Tue, 18 Dec 2012 12:37:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:sender:subject:mime-version:content-type:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to:x-mailer:x-gm-message-state; bh=d8JiGBXi83yepZQ0AxYKBf6+kTWDVimdqpbqgK+x39M=; b=SqVsh6Ax/fpAgf68P9VkeWOwb/z6/qtuhhoHW5eHqGhfn2VaHcfxqrXu3VhKMKdXKa TuysZepEv3OX2e2TYA8YgxqvOiC/+2cRZdrVTjBLPidLhR/HBlskwybRCkGy2cF1GP4D 4GYtythVGdflSCb8p5+nb/BIu8m3qqhWaHdd4PBZFFDkZAAkyEalTREXroTc5TNiNdnC QMnbrrCmQnZlArE93+ECiVf/Kq6xHa9ujaFjl+mMHFIroyQr8YGL25qo06XcvqToM+wz U33Ldprs+YC8+DTd952meHj0X+q/SDYnadws2tJEwPkS05fFoly2LoIXeLwW8DLS6WH2 nMeQ== X-Received: by 10.60.32.67 with SMTP id g3mr2754504oei.77.1355862645993; Tue, 18 Dec 2012 12:30:45 -0800 (PST) Received: from monkey-bot.int.fusionio.com ([209.117.142.2]) by mx.google.com with ESMTPS id a9sm1892367oee.10.2012.12.18.12.30.43 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 18 Dec 2012 12:30:44 -0800 (PST) Sender: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Mime-Version: 1.0 (Apple Message framework v1085) Content-Type: text/plain; charset=us-ascii From: Warner Losh In-Reply-To: <201212180922.22217.hselasky@c2i.net> Date: Tue, 18 Dec 2012 13:30:42 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <7005E47E-3AF3-4E8E-9AE2-795B7A02D3BB@bsdimp.com> References: <20121218204931.5322922d@fubar.geek.nz> <201212180922.22217.hselasky@c2i.net> To: Hans Petter Selasky X-Mailer: Apple Mail (2.1085) X-Gm-Message-State: ALoCoQmEch9UK7u6Ejv7EzLXkqUj6W6XuveCHOAHVNdUj+Aw3+ltCCTcCYtI3K9Elb9Oafu7c65k Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 20:37:49 -0000 On Dec 18, 2012, at 1:22 AM, Hans Petter Selasky wrote: > On Tuesday 18 December 2012 08:49:31 Andrew Turner wrote: >> Hello, >>=20 >> Oleksandr and myself have been looking into why when we enable the >> write-back cache on the PandaBoard there are kernel panics with USB. = We >> have tracked it down to an issue appending the ehci_qh_t to the list = at >> the end of ehci_setup_standard_chain(). >>=20 >> I have a patch at [1] that allows me to run sha256 on a 40MB file = over >> NSF using the built in smsc USB ethernet chip. The problem is I have >> had to place a call to DELAY before EHCI_APPEND_QH. This is obviously >> not the correct solution. >>=20 >> Is anyone able to help me narrow down what is missing? It appears to = be >> a missing cache invalidate or flush somewhere but I haven't been able >> to track down what cache function the DELAY is working around. >>=20 >> Andrew >>=20 >> [1] http://fubar.geek.nz/files/freebsd/ehci_4.diff >=20 > Hi, >=20 > Can you dump the DMA tag belonging to the QH via and check wether it = is mapped=20 > coherent or not. Thes QH- and TD- structures should not be cache = mapped. Else=20 > cache has not been disabled on those pages. busdma doesn't work that way. The coherent flag is just a hint.... Warner > qh->page_cache->tag >=20 > --HPS > _______________________________________________ > freebsd-usb@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-usb > To unsubscribe, send any mail to "freebsd-usb-unsubscribe@freebsd.org" From owner-freebsd-usb@FreeBSD.ORG Tue Dec 18 20:40:51 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C77CDFDB for ; Tue, 18 Dec 2012 20:40:51 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from mail-oa0-f50.google.com (mail-oa0-f50.google.com [209.85.219.50]) by mx1.freebsd.org (Postfix) with ESMTP id 7B04B8FC15 for ; Tue, 18 Dec 2012 20:40:51 +0000 (UTC) Received: by mail-oa0-f50.google.com with SMTP id n16so1165310oag.23 for ; Tue, 18 Dec 2012 12:40:50 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:sender:subject:mime-version:content-type:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to:x-mailer:x-gm-message-state; bh=/pIEfr53v03284Ea+DhfkZjGveH0+e/BG2XjwgP1yNo=; b=mY81bKsw2JGYOe8CSvDJrvB/7knA8KKFvXvzLV6pVplfU75pLkQ1s474APb151R3dn BfOkWTn6xVIMyYo3qOhxqpbSVcxvF4aDRyAIbDsFlrXleUkWKVCymsNhxczdT0iC1lrH OLPiZml/VK/FUgeJ8gJwm9hToGFw+S4UcNRCySDst/C3v5JPz0li+I68wm5NRrP5xyQl W1erheGizN+uewZhmuUp1wmRJVChlbfapdeCkSdTRc+lgjyT6vxJe9c4Z7wSHU7MsGl2 Lip2YI4F11/EBqCiBG3+0augh8ngLaUXctKSl2IxyiY70frE7ab7rxmqf4gTeJoWPObc wpWg== X-Received: by 10.60.13.134 with SMTP id h6mr2764727oec.64.1355862769696; Tue, 18 Dec 2012 12:32:49 -0800 (PST) Received: from monkey-bot.int.fusionio.com ([209.117.142.2]) by mx.google.com with ESMTPS id zz6sm1917217oeb.1.2012.12.18.12.32.47 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 18 Dec 2012 12:32:48 -0800 (PST) Sender: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Mime-Version: 1.0 (Apple Message framework v1085) Content-Type: text/plain; charset=us-ascii From: Warner Losh In-Reply-To: <201212182044.11326.hselasky@c2i.net> Date: Tue, 18 Dec 2012 13:32:46 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> References: <20121218204931.5322922d@fubar.geek.nz> <201212181306.44926.hselasky@c2i.net> <20121219081229.383d9f41@fubar.geek.nz> <201212182044.11326.hselasky@c2i.net> To: Hans Petter Selasky X-Mailer: Apple Mail (2.1085) X-Gm-Message-State: ALoCoQn9bYpDh+KkuPPeRnx5CW/dmfK6qfOvju/TZufeYykNN+C3eM5gfoxE2wUtZdwoQexITM3l Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Dec 2012 20:40:51 -0000 On Dec 18, 2012, at 12:44 PM, Hans Petter Selasky wrote: > On Tuesday 18 December 2012 20:12:29 Andrew Turner wrote: >> On Tue, 18 Dec 2012 13:06:44 +0100 >>=20 >> Hans Petter Selasky wrote: >>> Hi Andrew, >>>=20 >>>> The BUS_DMA_COHERENT flag does nothing on armv6 as we need the = cache >>>> enabled for atomic operations to work correctly and we would have = to >>>> disable the cache on the entire page. This is acceptable behaviour >>>> from the description of the flag in the busdma man page. >>>=20 >>> Yes, but when I allocate memory from the USB stack, then I want that >>> memory to not be cached. It is simply not that useful to have that >>> memory cached. I didn't check the latest state of busdma, but if I'm >>> not mistaken, if the BUS_DMA_COHERENT flag is set on the DMA tag, = the >>> flush/invalidate will simply return and do nothing. Maybe that is = the >>> problem ... >>=20 >> The exact meaning of BUS_DMA_COHERENT depends on the architecture. = The >> code is still required to call bus_dmamap_sync with a coherent map = but >> when the flag is implemented the cost of the operation will be = reduced. >> It doesn't guarantee the memory is uncached, it may be implemented = that >> way but the USB code can't rely on it. >>=20 >> Andrew >=20 > The USB code doesn't rely on this flag. I'm wondering if BUSDMA by = accident=20 > sets this flag, so that the cache sync ops are not called. No. It doesn't. Does the USB code still touch bytes in the same cache line while the DMA = is still outstanding? Warner= From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 06:57:31 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 39D6F397; Wed, 19 Dec 2012 06:57:31 +0000 (UTC) (envelope-from wkoszek@freebsd.czest.pl) Received: from freebsd.czest.pl (freebsd.czest.pl [212.87.224.105]) by mx1.freebsd.org (Postfix) with ESMTP id A99D38FC14; Wed, 19 Dec 2012 06:57:30 +0000 (UTC) Received-SPF: pass (freebsd.czest.pl: domain of wkoszek@freebsd.czest.pl designates 212.87.224.105 as permitted sender) receiver=freebsd.czest.pl; client-ip=212.87.224.105; helo=freebsd.czest.pl; envelope-from=wkoszek@freebsd.czest.pl; x-software=spfmilter 0.97 http://www.acme.com/software/spfmilter/ with libspf-unknown; Received: from freebsd.czest.pl (freebsd.czest.pl [212.87.224.105]) by freebsd.czest.pl (8.14.5/8.14.5) with ESMTP id qBJ6ePNF018219; Wed, 19 Dec 2012 06:40:25 GMT (envelope-from wkoszek@freebsd.czest.pl) Received: (from wkoszek@localhost) by freebsd.czest.pl (8.14.5/8.14.5/Submit) id qBJ6ePTS018218; Wed, 19 Dec 2012 06:40:25 GMT (envelope-from wkoszek) Date: Wed, 19 Dec 2012 06:40:25 +0000 From: "Wojciech A. Koszek" To: Hans Petter Selasky Subject: Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD Message-ID: <20121219064025.GB86339@FreeBSD.org> References: <201211162247.qAGMlTm2057387@red.freebsd.org> <201211171319.34781.hselasky@c2i.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-2 Content-Disposition: inline In-Reply-To: <201211171319.34781.hselasky@c2i.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on freebsd.czest.pl X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.2.7 (freebsd.czest.pl [212.87.224.105]); Wed, 19 Dec 2012 06:40:28 +0000 (UTC) Cc: freebsd-gnats-submit@freebsd.org, freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 06:57:31 -0000 On Sat, Nov 17, 2012 at 01:19:34PM +0100, Hans Petter Selasky wrote: > On Friday 16 November 2012 23:47:29 Wojciech A. Koszek wrote: > > >Number: 173666 > > >Category: usb > > >Synopsis: [USB, LIBUSB] usb_reset() behavior different between > > >GNU/Linux and FreeBSD Confidential: no > > >Severity: non-critical > > >Priority: low > > >Responsible: freebsd-usb > > >State: open > > >Quarter: > > >Keywords: > > >Date-Required: > > >Class: sw-bug > > >Submitter-Id: current-users > > >Arrival-Date: Fri Nov 16 22:50:00 UTC 2012 > > >Closed-Date: > > >Last-Modified: > > >Originator: Wojciech A. Koszek > > >Release: 9.0-RELEASE > > > > >Organization: > > FreeBSD > > > > >Environment: > > FreeBSD seu 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:15:25 UTC > > 2012 root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 > > > > >Description: > > I have a driver written for libusb, which works fine under GNU/Linux and > > libusb. Device: > > > > gen0.2: at usbus0, cfg=0 md=HOST spd=LOW > > (1.5Mbps) pwr=ON > > > > (I used USB sniffer to uncover traffic based on what Windows was doing) > > > > Under Linux usb_reset()+usb_set_configuration() calls works fine. Under > > FreeBSD I have to disable calling usb_reset(), otherwise > > usb_set_configuration() fails with I/O error. > > > > According to: > > http://libusb.sourceforge.net/doc/function.usbreset.html > > What you describe is the expected behaviour. Hans, I agree. This bug case can be closed then. Useful feature of our API would be to fail on a handle, if usb_reset() was called on it. -- Wojciech A. Koszek wkoszek@FreeBSD.czest.pl http://FreeBSD.czest.pl/~wkoszek/ From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 07:00:01 2012 Return-Path: Delivered-To: freebsd-usb@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 4B8483FE for ; Wed, 19 Dec 2012 07:00:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 16FA48FC0A for ; Wed, 19 Dec 2012 07:00:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qBJ700KP067674 for ; Wed, 19 Dec 2012 07:00:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qBJ700J7067669; Wed, 19 Dec 2012 07:00:00 GMT (envelope-from gnats) Date: Wed, 19 Dec 2012 07:00:00 GMT Message-Id: <201212190700.qBJ700J7067669@freefall.freebsd.org> To: freebsd-usb@FreeBSD.org Cc: From: "Wojciech A. Koszek" Subject: Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: "Wojciech A. Koszek" List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 07:00:01 -0000 The following reply was made to PR usb/173666; it has been noted by GNATS. From: "Wojciech A. Koszek" To: Hans Petter Selasky Cc: freebsd-usb@freebsd.org, freebsd-gnats-submit@freebsd.org Subject: Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD Date: Wed, 19 Dec 2012 06:40:25 +0000 On Sat, Nov 17, 2012 at 01:19:34PM +0100, Hans Petter Selasky wrote: > On Friday 16 November 2012 23:47:29 Wojciech A. Koszek wrote: > > >Number: 173666 > > >Category: usb > > >Synopsis: [USB, LIBUSB] usb_reset() behavior different between > > >GNU/Linux and FreeBSD Confidential: no > > >Severity: non-critical > > >Priority: low > > >Responsible: freebsd-usb > > >State: open > > >Quarter: > > >Keywords: > > >Date-Required: > > >Class: sw-bug > > >Submitter-Id: current-users > > >Arrival-Date: Fri Nov 16 22:50:00 UTC 2012 > > >Closed-Date: > > >Last-Modified: > > >Originator: Wojciech A. Koszek > > >Release: 9.0-RELEASE > > > > >Organization: > > FreeBSD > > > > >Environment: > > FreeBSD seu 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:15:25 UTC > > 2012 root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 > > > > >Description: > > I have a driver written for libusb, which works fine under GNU/Linux and > > libusb. Device: > > > > gen0.2: at usbus0, cfg=0 md=HOST spd=LOW > > (1.5Mbps) pwr=ON > > > > (I used USB sniffer to uncover traffic based on what Windows was doing) > > > > Under Linux usb_reset()+usb_set_configuration() calls works fine. Under > > FreeBSD I have to disable calling usb_reset(), otherwise > > usb_set_configuration() fails with I/O error. > > > > According to: > > http://libusb.sourceforge.net/doc/function.usbreset.html > > What you describe is the expected behaviour. Hans, I agree. This bug case can be closed then. Useful feature of our API would be to fail on a handle, if usb_reset() was called on it. -- Wojciech A. Koszek wkoszek@FreeBSD.czest.pl http://FreeBSD.czest.pl/~wkoszek/ From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 08:25:02 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 946692FC; Wed, 19 Dec 2012 08:25:02 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe06.c2i.net [212.247.154.162]) by mx1.freebsd.org (Postfix) with ESMTP id E32F38FC1C; Wed, 19 Dec 2012 08:25:01 +0000 (UTC) X-T2-Spam-Status: No, hits=-1.0 required=5.0 tests=ALL_TRUSTED Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe06.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 358683740; Wed, 19 Dec 2012 09:24:58 +0100 From: Hans Petter Selasky To: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Date: Wed, 19 Dec 2012 09:26:35 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212182044.11326.hselasky@c2i.net> <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> In-Reply-To: <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212190926.35132.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 08:25:02 -0000 On Tuesday 18 December 2012 21:32:46 Warner Losh wrote: > On Dec 18, 2012, at 12:44 PM, Hans Petter Selasky wrote: > > On Tuesday 18 December 2012 20:12:29 Andrew Turner wrote: > >> On Tue, 18 Dec 2012 13:06:44 +0100 > >> > >> Hans Petter Selasky wrote: > >>> Hi Andrew, > >>> > >>>> The BUS_DMA_COHERENT flag does nothing on armv6 as we need the cache > >>>> enabled for atomic operations to work correctly and we would have to > >>>> disable the cache on the entire page. This is acceptable behaviour > >>>> from the description of the flag in the busdma man page. > >>> > >>> Yes, but when I allocate memory from the USB stack, then I want that > >>> memory to not be cached. It is simply not that useful to have that > >>> memory cached. I didn't check the latest state of busdma, but if I'm > >>> not mistaken, if the BUS_DMA_COHERENT flag is set on the DMA tag, the > >>> flush/invalidate will simply return and do nothing. Maybe that is the > >>> problem ... > >> > >> The exact meaning of BUS_DMA_COHERENT depends on the architecture. The > >> code is still required to call bus_dmamap_sync with a coherent map but > >> when the flag is implemented the cost of the operation will be reduced. > >> It doesn't guarantee the memory is uncached, it may be implemented that > >> way but the USB code can't rely on it. > >> > >> Andrew > > > > The USB code doesn't rely on this flag. I'm wondering if BUSDMA by > > accident sets this flag, so that the cache sync ops are not called. > > No. It doesn't. > Hi, > Does the USB code still touch bytes in the same cache line while the DMA is > still outstanding? Yes, only for data. The busdma API must handle this case properly as discussed before. --HPS From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 08:55:00 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 676AD8F7; Wed, 19 Dec 2012 08:55:00 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe04.c2i.net [212.247.154.98]) by mx1.freebsd.org (Postfix) with ESMTP id 4BBDB8FC12; Wed, 19 Dec 2012 08:54:58 +0000 (UTC) X-T2-Spam-Status: No, hits=-0.2 required=5.0 tests=ALL_TRUSTED, BAYES_50 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe04.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 358726235; Wed, 19 Dec 2012 09:54:51 +0100 From: Hans Petter Selasky To: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Date: Wed, 19 Dec 2012 09:56:28 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212182044.11326.hselasky@c2i.net> <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> In-Reply-To: <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212190956.28609.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 08:55:00 -0000 Hi again, Different vendors use different naming conventions about sync operations. Maybe we should start defining some names and agree about that first? usb_pc_cpu_flush: This function is a system abstraction which is supposed to ensure that all CPU cached data for the given buffer is written to RAM before this function returns. usb_pc_cpu_invalidate: This function is a system abstraction which is supposed to ensure that all CPU cached data is cleared for the given buffer. These functions have been carefully added in all the USB drivers using DMA. Atomicity: I understand that the ARM hardware is not always compatible to this approach. 1) Flushing data to RAM is not a problem in any case? Do you agree? 2) Invalidating data is a problem, because invalidation can cause nearby data to be cleared aswell. So basically for those systems which are not handling this, flushing data means a lock of all CPU's until the flush/invalidate sequence is complete? Any dispute about this? If the CPU does not support certain features we cannot have an efficient system. It is like having a CPU which doesn't support switching off interrupt levels, like an 8-bit AVR. Then no matter how you twist it, you cannot postpone an interrupt to a software thread. Same goes for DMA support. If their DMA engine doesn't support byte granularity and possibility to flush/invalidate on a per-byte basis, then implement a global system lock to flush/invalidate data like I suggest, if this is not doable in the hardware by the CPU instruction set. The approach that I was recommended several years ago, is that I can pass a pointer to a buffer, which then can be transferred by the USB engine. This pointer can be any pointer except NULL. 3) As per my knowledge, using busdma to allocate a separate buffer for a 13- byte buffer, results in having a buffer of PAGE_SIZE bytes allocated. 4) BUSDMA experts: Please verify that the flags passed to bus_dmamap_sync() causes the exact behaviour has listed on top of this e-mail to occur in the following two functions in sys/dev/usb/usb_busdma.c void usb_pc_cpu_invalidate(struct usb_page_cache *pc) { if (pc->page_offset_end == pc->page_offset_buf) { /* nothing has been loaded into this page cache! */ return; } /* * TODO: We currently do XXX_POSTREAD and XXX_PREREAD at the * same time, but in the future we should try to isolate the * different cases to optimise the code. --HPS */ bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTREAD); bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREREAD); } void usb_pc_cpu_flush(struct usb_page_cache *pc) { if (pc->page_offset_end == pc->page_offset_buf) { /* nothing has been loaded into this page cache! */ return; } bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE); } --HPS From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 14:30:00 2012 Return-Path: Delivered-To: freebsd-usb@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id DE05882B for ; Wed, 19 Dec 2012 14:30:00 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 99ED88FC13 for ; Wed, 19 Dec 2012 14:30:00 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qBJEU0lb092020 for ; Wed, 19 Dec 2012 14:30:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qBJEU03H092019; Wed, 19 Dec 2012 14:30:00 GMT (envelope-from gnats) Resent-Date: Wed, 19 Dec 2012 14:30:00 GMT Resent-Message-Id: <201212191430.qBJEU03H092019@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-usb@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, David Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 09F705D6 for ; Wed, 19 Dec 2012 14:23:29 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id E55358FC0A for ; Wed, 19 Dec 2012 14:23:28 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.5/8.14.5) with ESMTP id qBJENSV7035771 for ; Wed, 19 Dec 2012 14:23:28 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.5/8.14.5/Submit) id qBJENS5p035770; Wed, 19 Dec 2012 14:23:28 GMT (envelope-from nobody) Message-Id: <201212191423.qBJENS5p035770@red.freebsd.org> Date: Wed, 19 Dec 2012 14:23:28 GMT From: David To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Subject: usb/174575: Interrupt storm error on startup X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 14:30:00 -0000 >Number: 174575 >Category: usb >Synopsis: Interrupt storm error on startup >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-usb >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Dec 19 14:30:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: David >Release: 9.1 >Organization: Home >Environment: FreeBSD pcbsd-5925 9.1-RELEASE FreeBSD 9.1-RELEASE #2: Tue Nov 27 03:45:16 UTC 2012 root@darkstar:/usr/obj/pcbsd-build90/fbsd-source/9.1/sys/GENERIC amd64 >Description: On startup, sometimes it gets stuck, with lines of text saying "interrupt storm error". (The actual wording is: "interrupt storm detected on "irq17:"; throttling interrupt source".) It appears to be caused by the USB mouse. I know that the USB mouse works properly and there are no hardware faults of any kind. >How-To-Repeat: Use a USB mouse and sometimes (not always) the bootup will freeze and only output lines of the error message. >Fix: >Release-Note: >Audit-Trail: >Unformatted: From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 16:00:54 2012 Return-Path: Delivered-To: freebsd-usb@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id CC173FB3; Wed, 19 Dec 2012 16:00:54 +0000 (UTC) (envelope-from eadler@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 99E1D8FC12; Wed, 19 Dec 2012 16:00:54 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qBJG0sC4094954; Wed, 19 Dec 2012 16:00:54 GMT (envelope-from eadler@freefall.freebsd.org) Received: (from eadler@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qBJG0stK094950; Wed, 19 Dec 2012 16:00:54 GMT (envelope-from eadler) Date: Wed, 19 Dec 2012 16:00:54 GMT Message-Id: <201212191600.qBJG0stK094950@freefall.freebsd.org> To: wkoszek@FreeBSD.org, eadler@FreeBSD.org, freebsd-usb@FreeBSD.org From: eadler@FreeBSD.org Subject: Re: usb/173666: [usb] [libusb] usb_reset() behavior different between GNU/Linux and FreeBSD X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 16:00:54 -0000 Synopsis: [usb] [libusb] usb_reset() behavior different between GNU/Linux and FreeBSD State-Changed-From-To: open->closed State-Changed-By: eadler State-Changed-When: Wed Dec 19 16:00:54 UTC 2012 State-Changed-Why: Per submitter request http://www.freebsd.org/cgi/query-pr.cgi?pr=173666 From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 16:40:02 2012 Return-Path: Delivered-To: freebsd-usb@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 68DB1425 for ; Wed, 19 Dec 2012 16:40:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 47CB08FC13 for ; Wed, 19 Dec 2012 16:40:02 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qBJGe27i096661 for ; Wed, 19 Dec 2012 16:40:02 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qBJGe2ZK096660; Wed, 19 Dec 2012 16:40:02 GMT (envelope-from gnats) Date: Wed, 19 Dec 2012 16:40:02 GMT Message-Id: <201212191640.qBJGe2ZK096660@freefall.freebsd.org> To: freebsd-usb@FreeBSD.org Cc: From: David Subject: Re: usb/174575: Interrupt storm error on startup X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: David List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 16:40:02 -0000 The following reply was made to PR usb/174575; it has been noted by GNATS. From: David To: bug-followup@FreeBSD.org, turbolad995@yahoo.co.uk Cc: Subject: Re: usb/174575: Interrupt storm error on startup Date: Wed, 19 Dec 2012 16:36:27 +0000 This is a multi-part message in MIME format. --------------050303020907060504040908 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi Attached is a picture showing this problem. I have posted more details about this problem in the PC-BSD forums, under "Startup Bug Reports". I first reported it in September when I was beta-testing PC-BSD: http://forums.pcbsd.org/showthread.php?t=17903 Hope that helps. Regards David --------------050303020907060504040908 Content-Type: image/jpeg; name="interrupt storm irq17.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="interrupt storm irq17.jpg" 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 Kysif//Z --------------050303020907060504040908-- From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 18:58:49 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 4F94333F for ; Wed, 19 Dec 2012 18:58:49 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from mail-pb0-f45.google.com (mail-pb0-f45.google.com [209.85.160.45]) by mx1.freebsd.org (Postfix) with ESMTP id 1554F8FC0A for ; Wed, 19 Dec 2012 18:58:48 +0000 (UTC) Received: by mail-pb0-f45.google.com with SMTP id mc8so1410568pbc.18 for ; Wed, 19 Dec 2012 10:58:48 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:sender:subject:mime-version:content-type:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to:x-mailer:x-gm-message-state; bh=WVxI1JkugBHI7AEmxo2kqRHe7J9KoybbisPIOxTXR9M=; b=QwfIO4JQM9ADZviPn7yaeqZ0/voyYYHdiJ8jjRkkvWGw7XEhHrToMaMHBQTpVBRuDo uYeJlN1Hv7vrIfxrMrQ5vup7gOlappD18W6ZKYva6v9nLzrooRJe7Fqka5Llq/H3MS0c vGqgir40pMNagBxDJakzxPvSeJ9aH6+niCGfBplBBQVTwmIrEKeo19E0/WSptKhR22hj Z/kQxP2l3fNtMmjJXil8OPXLP8Rry9JQbXK0VotxJE40LbyXo5Pkkp5xVCf/NXqxzoea sf7rEBjXPSwJpFlTWvAmESYxr9dkSynq49wxui5xXE6k04CFAAE8OgrC0n/YcJ0pzNd/ j3GA== X-Received: by 10.68.220.198 with SMTP id py6mr21383129pbc.119.1355943528671; Wed, 19 Dec 2012 10:58:48 -0800 (PST) Received: from [10.0.0.53] (50-78-194-198-static.hfc.comcastbusiness.net. [50.78.194.198]) by mx.google.com with ESMTPS id kp4sm3532161pbc.52.2012.12.19.10.58.45 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 19 Dec 2012 10:58:47 -0800 (PST) Sender: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Mime-Version: 1.0 (Apple Message framework v1085) Content-Type: text/plain; charset=us-ascii From: Warner Losh In-Reply-To: <201212190926.35132.hselasky@c2i.net> Date: Wed, 19 Dec 2012 11:58:42 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: References: <20121218204931.5322922d@fubar.geek.nz> <201212182044.11326.hselasky@c2i.net> <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> <201212190926.35132.hselasky@c2i.net> To: Hans Petter Selasky X-Mailer: Apple Mail (2.1085) X-Gm-Message-State: ALoCoQmnc8lte1AHwCse32faw08ooqma9/xs3QgLGcSOKOXrWdxANplD281JWODNs68no8BPRYGT Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 18:58:49 -0000 On Dec 19, 2012, at 1:26 AM, Hans Petter Selasky wrote: > On Tuesday 18 December 2012 21:32:46 Warner Losh wrote: >> On Dec 18, 2012, at 12:44 PM, Hans Petter Selasky wrote: >>> On Tuesday 18 December 2012 20:12:29 Andrew Turner wrote: >>>> On Tue, 18 Dec 2012 13:06:44 +0100 >>>>=20 >>>> Hans Petter Selasky wrote: >>>>> Hi Andrew, >>>>>=20 >>>>>> The BUS_DMA_COHERENT flag does nothing on armv6 as we need the = cache >>>>>> enabled for atomic operations to work correctly and we would have = to >>>>>> disable the cache on the entire page. This is acceptable = behaviour >>>>>> from the description of the flag in the busdma man page. >>>>>=20 >>>>> Yes, but when I allocate memory from the USB stack, then I want = that >>>>> memory to not be cached. It is simply not that useful to have that >>>>> memory cached. I didn't check the latest state of busdma, but if = I'm >>>>> not mistaken, if the BUS_DMA_COHERENT flag is set on the DMA tag, = the >>>>> flush/invalidate will simply return and do nothing. Maybe that is = the >>>>> problem ... >>>>=20 >>>> The exact meaning of BUS_DMA_COHERENT depends on the architecture. = The >>>> code is still required to call bus_dmamap_sync with a coherent map = but >>>> when the flag is implemented the cost of the operation will be = reduced. >>>> It doesn't guarantee the memory is uncached, it may be implemented = that >>>> way but the USB code can't rely on it. >>>>=20 >>>> Andrew >>>=20 >>> The USB code doesn't rely on this flag. I'm wondering if BUSDMA by >>> accident sets this flag, so that the cache sync ops are not called. >>=20 >> No. It doesn't. >>=20 >=20 > Hi, >=20 >> Does the USB code still touch bytes in the same cache line while the = DMA is >> still outstanding? >=20 > Yes, only for data. The busdma API must handle this case properly as = discussed=20 > before. No, it mustn't. It can't. The hardware is such that it is impossible to = do this, as discussed before. You can't mix access to memory in the same = cache line between host and DMA. Warner= From owner-freebsd-usb@FreeBSD.ORG Wed Dec 19 19:18:36 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 544639D9 for ; Wed, 19 Dec 2012 19:18:36 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from mail-da0-f47.google.com (mail-da0-f47.google.com [209.85.210.47]) by mx1.freebsd.org (Postfix) with ESMTP id 172AF8FC13 for ; Wed, 19 Dec 2012 19:18:35 +0000 (UTC) Received: by mail-da0-f47.google.com with SMTP id s35so1079362dak.6 for ; Wed, 19 Dec 2012 11:18:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:sender:subject:mime-version:content-type:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to:x-mailer:x-gm-message-state; bh=ftDPIv6LQaTxJJFPscI4aqK8+o1pfJGP8FYh4RQMzkg=; b=mQbTMU8OF3rA+EW1Rof3+aZJdRDnIZQiWsNV4PT4lrBR/E8krecb1hBM493oHU0oxo 1kKYvD6V1XnSF8qdzIbMGa/l+piHsO4xI/XaYy8yiGQYbylM1wRvRQFJMB3wuGe3NRTy nH1H3SyYExquZM+2hSwG50Rk4xYdA8/SdxxLb7fZHYMzNTnoPdAIN346gS02ioeEe6P2 iqAGKb+xfA3U5KWpmKdSeHBjRARIFJvyvuq1anndqG6CAQpXaEod7NaMzNIccgQRZGzX KbdlrkzhA6dTIOEfA5wncEOw/9FBy3B+wE3e+t9a8bEuY0EIL5ptkNyoVZaPcoY8FvRa ay9g== X-Received: by 10.68.252.228 with SMTP id zv4mr21594007pbc.134.1355944381471; Wed, 19 Dec 2012 11:13:01 -0800 (PST) Received: from [10.0.0.53] (50-78-194-198-static.hfc.comcastbusiness.net. [50.78.194.198]) by mx.google.com with ESMTPS id vo8sm3558821pbc.16.2012.12.19.11.12.58 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 19 Dec 2012 11:12:59 -0800 (PST) Sender: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Mime-Version: 1.0 (Apple Message framework v1085) Content-Type: text/plain; charset=us-ascii From: Warner Losh In-Reply-To: <201212190956.28609.hselasky@c2i.net> Date: Wed, 19 Dec 2012 12:12:55 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> References: <20121218204931.5322922d@fubar.geek.nz> <201212182044.11326.hselasky@c2i.net> <1482FC19-720A-480A-BAD2-C8CD306E2E5F@bsdimp.com> <201212190956.28609.hselasky@c2i.net> To: Hans Petter Selasky X-Mailer: Apple Mail (2.1085) X-Gm-Message-State: ALoCoQliGlgQqyUK3Zly4OneIgLNYZ9ofrdxivs9gzD6itXbTczKXWWRuBUrqf5V4q3inbE7clkV Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2012 19:18:36 -0000 On Dec 19, 2012, at 1:56 AM, Hans Petter Selasky wrote: > Hi again, >=20 > Different vendors use different naming conventions about sync = operations.=20 The different names are often for subtly different types of cache = flushing. > Maybe we should start defining some names and agree about that first? >=20 > usb_pc_cpu_flush: >=20 > This function is a system abstraction which is supposed to ensure that = all CPU=20 > cached data for the given buffer is written to RAM before this = function=20 > returns. First off, why can't you just use the normal busdma interface? Second, does this also invalidate the cache lines? There's many kinds of = flushes as well, depending on the cache coherency model for MP.. > usb_pc_cpu_invalidate: >=20 > This function is a system abstraction which is supposed to ensure that = all CPU=20 > cached data is cleared for the given buffer. So does this throw the data that's in the cache away? Or does it write = back before discarding it? > These functions have been carefully added in all the USB drivers using = DMA. >=20 > Atomicity: >=20 > I understand that the ARM hardware is not always compatible to this = approach. Yes, since it fails to capture the subtly of the ARM hardware which the = busdma abstraction captures. > 1) Flushing data to RAM is not a problem in any case? Do you agree? As long as there's no DMA outstanding to the memory addressed by the = cache line being flushed, yes. > 2) Invalidating data is a problem, because invalidation can cause = nearby data=20 > to be cleared aswell. So basically for those systems which are not = handling=20 > this, flushing data means a lock of all CPU's until the = flush/invalidate=20 > sequence is complete? Any dispute about this? Yes. You can generally only invalidate to the cache line level. That's = why I was asking about the subtly in what you mean by invalidate. ARM = can and does flush data properly, but this might not match your usage. You forgot 3) Touching data in the same cache line while the DMA is going on. This is a complete no-no and must never be done. Cache lines must not be = polluted while the DMA is happening. > If the CPU does not support certain features we cannot have an = efficient=20 > system. It is like having a CPU which doesn't support switching off = interrupt=20 > levels, like an 8-bit AVR. Most RISC CPUs don't support a coherent cache, it is true. However, they = do support efficient and succinct cache operations. The busdma = abtraction handles this nicely for all other kinds of devices, why is = usb so different? > Then no matter how you twist it, you cannot=20 > postpone an interrupt to a software thread. Same goes for DMA support. = If=20 > their DMA engine doesn't support byte granularity and possibility to=20= > flush/invalidate on a per-byte basis, then implement a global system = lock to=20 > flush/invalidate data like I suggest, if this is not doable in the = hardware by=20 > the CPU instruction set. The DMA engine support it. You can do byte-aligned transfers all day = long. However, the cache does not. You must segregate data to get proper = operations. There's nothing that you can do about that. You must not mix = accesses to memory within a cache line. To do so will cause problems, as = evidence by the problems we are seeing. > The approach that I was recommended several years ago, is that I can = pass a=20 > pointer to a buffer, which then can be transferred by the USB engine. = This=20 > pointer can be any pointer except NULL. >=20 > 3) As per my knowledge, using busdma to allocate a separate buffer for = a 13- > byte buffer, results in having a buffer of PAGE_SIZE bytes allocated. Not with Ian's slab allocator... > 4) BUSDMA experts: Please verify that the flags passed to = bus_dmamap_sync()=20 > causes the exact behaviour has listed on top of this e-mail to occur = in the=20 > following two functions in sys/dev/usb/usb_busdma.c >=20 > void > usb_pc_cpu_invalidate(struct usb_page_cache *pc) > { > if (pc->page_offset_end =3D=3D pc->page_offset_buf) { > /* nothing has been loaded into this page cache! */ > return; > } >=20 > /* > * TODO: We currently do XXX_POSTREAD and XXX_PREREAD at the > * same time, but in the future we should try to isolate the > * different cases to optimise the code. --HPS > */ > bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTREAD); > bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREREAD); > } This is almost certainly wrong. POSTREAD should be called right after = the read had completed. PREREAD should be called immediately before = starting a DMA operation after all adjacent memory accesses have = stopped. > void > usb_pc_cpu_flush(struct usb_page_cache *pc) > { > if (pc->page_offset_end =3D=3D pc->page_offset_buf) { > /* nothing has been loaded into this page cache! */ > return; > } > bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE); > } This is likely correct, but insufficient. There's no POSTWRITE sync = that's done after all the data has been transferred. Warner From owner-freebsd-usb@FreeBSD.ORG Thu Dec 20 07:28:25 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C3D68B89; Thu, 20 Dec 2012 07:28:25 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe04.c2i.net [212.247.154.98]) by mx1.freebsd.org (Postfix) with ESMTP id 1B8698FC0A; Thu, 20 Dec 2012 07:28:23 +0000 (UTC) X-T2-Spam-Status: No, hits=-0.2 required=5.0 tests=ALL_TRUSTED, BAYES_50 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe04.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 359128857; Thu, 20 Dec 2012 08:28:20 +0100 From: Hans Petter Selasky To: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Date: Thu, 20 Dec 2012 08:29:56 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> <201212200827.40860.hselasky@c2i.net> In-Reply-To: <201212200827.40860.hselasky@c2i.net> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212200829.56954.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2012 07:28:25 -0000 BTW: This commit looks exactly like my X-mas present :-) http://svnweb.freebsd.org/changeset/base/244471 --HPS From owner-freebsd-usb@FreeBSD.ORG Thu Dec 20 07:31:14 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6FF85BE0; Thu, 20 Dec 2012 07:31:14 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe03.c2i.net [212.247.154.66]) by mx1.freebsd.org (Postfix) with ESMTP id 70F5B8FC0A; Thu, 20 Dec 2012 07:31:13 +0000 (UTC) X-T2-Spam-Status: No, hits=-0.2 required=5.0 tests=ALL_TRUSTED, BAYES_50 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe03.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 193130133; Thu, 20 Dec 2012 08:26:04 +0100 From: Hans Petter Selasky To: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Date: Thu, 20 Dec 2012 08:27:40 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212190956.28609.hselasky@c2i.net> <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> In-Reply-To: <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212200827.40860.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2012 07:31:14 -0000 On Wednesday 19 December 2012 20:12:55 Warner Losh wrote: > On Dec 19, 2012, at 1:56 AM, Hans Petter Selasky wrote: > > Hi again, > > > > Different vendors use different naming conventions about sync operations. > > The different names are often for subtly different types of cache flushing. > > > Maybe we should start defining some names and agree about that first? > > > > usb_pc_cpu_flush: > > > > This function is a system abstraction which is supposed to ensure that > > all CPU cached data for the given buffer is written to RAM before this > > function returns. > Hi, > First off, why can't you just use the normal busdma interface? Because the API was confusing when I wrote the USB code. It wasn't obvious what the different functions were doing. > > Second, does this also invalidate the cache lines? There's many kinds of > flushes as well, depending on the cache coherency model for MP.. No, flush as used in the USB code does not require cache line invalidation. > > > usb_pc_cpu_invalidate: > > > > This function is a system abstraction which is supposed to ensure that > > all CPU cached data is cleared for the given buffer. > > So does this throw the data that's in the cache away? Or does it write back > before discarding it? It should trow away all data in the cache for the given range. No write back first. > > > These functions have been carefully added in all the USB drivers using > > DMA. > > > > Atomicity: > > > > I understand that the ARM hardware is not always compatible to this > > approach. > > Yes, since it fails to capture the subtly of the ARM hardware which the > busdma abstraction captures. > > > 1) Flushing data to RAM is not a problem in any case? Do you agree? > > As long as there's no DMA outstanding to the memory addressed by the cache > line being flushed, yes. > > > 2) Invalidating data is a problem, because invalidation can cause nearby > > data to be cleared aswell. So basically for those systems which are not > > handling this, flushing data means a lock of all CPU's until the > > flush/invalidate sequence is complete? Any dispute about this? > > Yes. You can generally only invalidate to the cache line level. That's why > I was asking about the subtly in what you mean by invalidate. ARM can and > does flush data properly, but this might not match your usage. > > You forgot > > 3) Touching data in the same cache line while the DMA is going on. > > This is a complete no-no and must never be done. Cache lines must not be > polluted while the DMA is happening. > > > If the CPU does not support certain features we cannot have an efficient > > system. It is like having a CPU which doesn't support switching off > > interrupt levels, like an 8-bit AVR. > > Most RISC CPUs don't support a coherent cache, it is true. However, they do > support efficient and succinct cache operations. The busdma abtraction > handles this nicely for all other kinds of devices, why is usb so > different? > > > Then no matter how you twist it, you cannot > > postpone an interrupt to a software thread. Same goes for DMA support. If > > their DMA engine doesn't support byte granularity and possibility to > > flush/invalidate on a per-byte basis, then implement a global system lock > > to flush/invalidate data like I suggest, if this is not doable in the > > hardware by the CPU instruction set. > > The DMA engine support it. You can do byte-aligned transfers all day long. > > However, the cache does not. You must segregate data to get proper > operations. There's nothing that you can do about that. You must not mix > accesses to memory within a cache line. To do so will cause problems, as > evidence by the problems we are seeing. > > > The approach that I was recommended several years ago, is that I can pass > > a pointer to a buffer, which then can be transferred by the USB engine. > > This pointer can be any pointer except NULL. > > > > 3) As per my knowledge, using busdma to allocate a separate buffer for a > > 13- byte buffer, results in having a buffer of PAGE_SIZE bytes > > allocated. > > Not with Ian's slab allocator... > > > 4) BUSDMA experts: Please verify that the flags passed to > > bus_dmamap_sync() causes the exact behaviour has listed on top of this > > e-mail to occur in the following two functions in > > sys/dev/usb/usb_busdma.c > > > > void > > usb_pc_cpu_invalidate(struct usb_page_cache *pc) > > { > > > > if (pc->page_offset_end == pc->page_offset_buf) { > > > > /* nothing has been loaded into this page cache! */ > > return; > > > > } > > > > /* > > > > * TODO: We currently do XXX_POSTREAD and XXX_PREREAD at the > > * same time, but in the future we should try to isolate the > > * different cases to optimise the code. --HPS > > */ > > > > bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_POSTREAD); > > bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREREAD); > > > > } > > This is almost certainly wrong. POSTREAD should be called right after the > read had completed. PREREAD should be called immediately before starting > a DMA operation after all adjacent memory accesses have stopped. > > > void > > usb_pc_cpu_flush(struct usb_page_cache *pc) > > { > > > > if (pc->page_offset_end == pc->page_offset_buf) { > > > > /* nothing has been loaded into this page cache! */ > > return; > > > > } > > bus_dmamap_sync(pc->tag, pc->map, BUS_DMASYNC_PREWRITE); > > > > } > > This is likely correct, but insufficient. There's no POSTWRITE sync that's > done after all the data has been transferred. I can offer to implement a USB bounce buffer that fixes these issues. I think the existing USB API's and ways of doing stuff below the USB controllers is fine, and then check the drivers which pass pointers, like umass that the buffers we get are allocated correctly. Is there a way in 9-stable and 10-stable to force allocation of non-cached memory for the platforms in question, ARM, RISC, SPARC ... Because really, I think that would be the best! For example it is very slow to update a word and then invalidate a 4K region, which is very frequently the use-case for USB. --HPS From owner-freebsd-usb@FreeBSD.ORG Thu Dec 20 13:02:26 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 35E1529F; Thu, 20 Dec 2012 13:02:26 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe02.c2i.net [212.247.154.34]) by mx1.freebsd.org (Postfix) with ESMTP id C4FF28FC0C; Thu, 20 Dec 2012 13:02:24 +0000 (UTC) X-T2-Spam-Status: No, hits=-1.0 required=5.0 tests=ALL_TRUSTED, BAYES_40 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe02.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 361057281; Thu, 20 Dec 2012 13:57:13 +0100 From: Hans Petter Selasky To: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Date: Thu, 20 Dec 2012 13:58:50 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212190956.28609.hselasky@c2i.net> <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> In-Reply-To: <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_Kuw0QlgeVxE9A/+" Message-Id: <201212201358.50067.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2012 13:02:26 -0000 --Boundary-00=_Kuw0QlgeVxE9A/+ Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hi, Please try the attached patch for 10-current. The patch is not tested yet, only compiles. I will try to test more later today. Let me know if you see any issues. --HPS --Boundary-00=_Kuw0QlgeVxE9A/+ Content-Type: text/x-patch; charset="iso-8859-1"; name="usb_patches_multiple.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="usb_patches_multiple.diff" === dev/usb/serial/usb_serial.c ================================================================== --- dev/usb/serial/usb_serial.c (revision 244051) +++ dev/usb/serial/usb_serial.c (local) @@ -797,10 +797,14 @@ DPRINTF("tp=%p\n", tp); if (ttydisc_can_bypass(tp) != 0 || - (sc->sc_flag & UCOM_FLAG_HL_READY) == 0) { + (sc->sc_flag & UCOM_FLAG_HL_READY) == 0 || + (sc->sc_flag & UCOM_FLAG_INWAKEUP) != 0) { return; } + /* prevent recursion */ + sc->sc_flag |= UCOM_FLAG_INWAKEUP; + pos = sc->sc_jitterbuf_out; while (sc->sc_jitterbuf_in != pos) { @@ -821,6 +825,8 @@ if ((sc->sc_jitterbuf_in == pos) && (sc->sc_flag & UCOM_FLAG_RTS_IFLOW)) ucom_rts(sc, 0); + + sc->sc_flag &= ~UCOM_FLAG_INWAKEUP; } static int === dev/usb/serial/usb_serial.h ================================================================== --- dev/usb/serial/usb_serial.h (revision 244051) +++ dev/usb/serial/usb_serial.h (local) @@ -183,6 +183,7 @@ #define UCOM_FLAG_CONSOLE 0x80 /* set if device is a console */ #define UCOM_FLAG_WAIT_REFS 0x0100 /* set if we must wait for refs */ #define UCOM_FLAG_FREE_UNIT 0x0200 /* set if we must free the unit */ +#define UCOM_FLAG_INWAKEUP 0x0400 /* set if we are in the tty_inwakeup callback */ uint8_t sc_lsr; uint8_t sc_msr; uint8_t sc_mcr; === dev/usb/storage/ustorage_fs.c ================================================================== --- dev/usb/storage/ustorage_fs.c (revision 244051) +++ dev/usb/storage/ustorage_fs.c (local) @@ -74,7 +74,7 @@ /* Define some limits */ #ifndef USTORAGE_FS_BULK_SIZE -#define USTORAGE_FS_BULK_SIZE (1UL << 17) /* bytes */ +#define USTORAGE_FS_BULK_SIZE (1U << 17) /* bytes */ #endif #ifndef USTORAGE_FS_MAX_LUN @@ -85,8 +85,6 @@ #define USTORAGE_QDATA_MAX 40 /* bytes */ #endif -#define sc_cmd_data sc_cbw.CBWCDB - /* * The SCSI ID string must be exactly 28 characters long * exluding the terminating zero. @@ -176,8 +174,9 @@ struct ustorage_fs_softc { - ustorage_fs_bbb_cbw_t sc_cbw; /* Command Wrapper Block */ - ustorage_fs_bbb_csw_t sc_csw; /* Command Status Block */ + ustorage_fs_bbb_cbw_t *sc_cbw; /* Command Wrapper Block */ + ustorage_fs_bbb_csw_t *sc_csw; /* Command Status Block */ + void *sc_dma_ptr; /* Main data buffer */ struct mtx sc_mtx; @@ -275,7 +274,6 @@ .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = sizeof(ustorage_fs_bbb_cbw_t), - .flags = {.ext_buffer = 1,}, .callback = &ustorage_fs_t_bbb_command_callback, .usb_mode = USB_MODE_DEVICE, }, @@ -295,7 +293,7 @@ .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = USTORAGE_FS_BULK_SIZE, - .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,.ext_buffer = 1}, + .flags = {.proxy_buffer = 1,.short_xfer_ok = 1}, .callback = &ustorage_fs_t_bbb_data_read_callback, .usb_mode = USB_MODE_DEVICE, }, @@ -315,7 +313,7 @@ .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .bufsize = sizeof(ustorage_fs_bbb_csw_t), - .flags = {.short_xfer_ok = 1,.ext_buffer = 1,}, + .flags = {.short_xfer_ok = 1}, .callback = &ustorage_fs_t_bbb_status_callback, .usb_mode = USB_MODE_DEVICE, }, @@ -409,6 +407,14 @@ "transfers, %s\n", usbd_errstr(err)); goto detach; } + + sc->sc_cbw = usbd_xfer_get_frame_buffer(sc->sc_xfer[ + USTORAGE_FS_T_BBB_COMMAND], 0); + sc->sc_csw = usbd_xfer_get_frame_buffer(sc->sc_xfer[ + USTORAGE_FS_T_BBB_STATUS], 0); + sc->sc_dma_ptr = usbd_xfer_get_frame_buffer(sc->sc_xfer[ + USTORAGE_FS_T_BBB_DATA_READ], 0); + /* start Mass Storage State Machine */ mtx_lock(&sc->sc_mtx); @@ -518,44 +524,44 @@ switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: - tag = UGETDW(sc->sc_cbw.dCBWSignature); + tag = UGETDW(sc->sc_cbw->dCBWSignature); if (tag != CBWSIGNATURE) { /* do nothing */ DPRINTF("invalid signature 0x%08x\n", tag); break; } - tag = UGETDW(sc->sc_cbw.dCBWTag); + tag = UGETDW(sc->sc_cbw->dCBWTag); /* echo back tag */ - USETDW(sc->sc_csw.dCSWTag, tag); + USETDW(sc->sc_csw->dCSWTag, tag); /* reset status */ - sc->sc_csw.bCSWStatus = 0; + sc->sc_csw->bCSWStatus = 0; /* reset data offset, data length and data remainder */ sc->sc_transfer.offset = 0; sc->sc_transfer.data_rem = - UGETDW(sc->sc_cbw.dCBWDataTransferLength); + UGETDW(sc->sc_cbw->dCBWDataTransferLength); /* reset data flags */ sc->sc_transfer.data_short = 0; /* extract LUN */ - sc->sc_transfer.lun = sc->sc_cbw.bCBWLUN; + sc->sc_transfer.lun = sc->sc_cbw->bCBWLUN; if (sc->sc_transfer.data_rem == 0) { sc->sc_transfer.cbw_dir = DIR_NONE; } else { - if (sc->sc_cbw.bCBWFlags & CBWFLAGS_IN) { + if (sc->sc_cbw->bCBWFlags & CBWFLAGS_IN) { sc->sc_transfer.cbw_dir = DIR_WRITE; } else { sc->sc_transfer.cbw_dir = DIR_READ; } } - sc->sc_transfer.cmd_len = sc->sc_cbw.bCDBLength; - if ((sc->sc_transfer.cmd_len > sizeof(sc->sc_cbw.CBWCDB)) || + sc->sc_transfer.cmd_len = sc->sc_cbw->bCDBLength; + if ((sc->sc_transfer.cmd_len > sizeof(sc->sc_cbw->CBWCDB)) || (sc->sc_transfer.cmd_len == 0)) { /* just halt - this is invalid */ DPRINTF("invalid command length %d bytes\n", @@ -597,9 +603,6 @@ usbd_xfer_set_stall(xfer); DPRINTF("stall pipe\n"); } - - usbd_xfer_set_frame_data(xfer, 0, &sc->sc_cbw, - sizeof(sc->sc_cbw)); usbd_transfer_submit(xfer); break; @@ -616,9 +619,9 @@ goto tr_setup; } if (err) { - if (sc->sc_csw.bCSWStatus == 0) { + if (sc->sc_csw->bCSWStatus == 0) { /* set some default error code */ - sc->sc_csw.bCSWStatus = CSWSTATUS_FAILED; + sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED; } if (sc->sc_transfer.cbw_dir == DIR_READ) { /* dump all data */ @@ -699,6 +702,9 @@ switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: + /* XXX copy data from DMA buffer */ + memcpy(sc->sc_transfer.data_ptr, sc->sc_dma_ptr, actlen); + sc->sc_transfer.data_rem -= actlen; sc->sc_transfer.data_ptr += actlen; sc->sc_transfer.offset += actlen; @@ -721,8 +727,7 @@ usbd_xfer_set_stall(xfer); } - usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr, - max_bulk); + usbd_xfer_set_frame_data(xfer, 0, sc->sc_dma_ptr, max_bulk); usbd_transfer_submit(xfer); break; @@ -778,8 +783,10 @@ usbd_xfer_set_stall(xfer); } - usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr, - max_bulk); + /* XXX copy data to DMA buffer */ + memcpy(sc->sc_dma_ptr, sc->sc_transfer.data_ptr, max_bulk); + + usbd_xfer_set_frame_data(xfer, 0, sc->sc_dma_ptr, max_bulk); usbd_transfer_submit(xfer); break; @@ -813,16 +820,13 @@ case USB_ST_SETUP: tr_setup: - USETDW(sc->sc_csw.dCSWSignature, CSWSIGNATURE); - USETDW(sc->sc_csw.dCSWDataResidue, sc->sc_transfer.data_rem); + USETDW(sc->sc_csw->dCSWSignature, CSWSIGNATURE); + USETDW(sc->sc_csw->dCSWDataResidue, sc->sc_transfer.data_rem); if (sc->sc_transfer.data_error) { sc->sc_transfer.data_error = 0; usbd_xfer_set_stall(xfer); } - - usbd_xfer_set_frame_data(xfer, 0, &sc->sc_csw, - sizeof(sc->sc_csw)); usbd_transfer_submit(xfer); break; @@ -934,17 +938,17 @@ /* * Get the starting Logical Block Address */ - lba = get_be32(&sc->sc_cmd_data[2]); + lba = get_be32(&sc->sc_cbw->CBWCDB[2]); /* * We allow DPO (Disable Page Out = don't save data in the cache) * but we don't implement it. */ - if ((sc->sc_cmd_data[1] & ~0x10) != 0) { + if ((sc->sc_cbw->CBWCDB[1] & ~0x10) != 0) { currlun->sense_data = SS_INVALID_FIELD_IN_CDB; return (1); } - vlen = get_be16(&sc->sc_cmd_data[7]); + vlen = get_be16(&sc->sc_cbw->CBWCDB[7]); if (vlen == 0) { goto done; } @@ -1092,8 +1096,8 @@ { uint8_t *buf = sc->sc_transfer.data_ptr; struct ustorage_fs_lun *currlun = sc->sc_transfer.currlun; - uint32_t lba = get_be32(&sc->sc_cmd_data[2]); - uint8_t pmi = sc->sc_cmd_data[8]; + uint32_t lba = get_be32(&sc->sc_cbw->CBWCDB[2]); + uint8_t pmi = sc->sc_cbw->CBWCDB[8]; /* Check the PMI and LBA fields */ if ((pmi > 1) || ((pmi == 0) && (lba != 0))) { @@ -1126,7 +1130,7 @@ uint8_t *buf0; uint16_t len; uint16_t limit; - uint8_t mscmnd = sc->sc_cmd_data[0]; + uint8_t mscmnd = sc->sc_cbw->CBWCDB[0]; uint8_t pc; uint8_t page_code; uint8_t changeable_values; @@ -1134,13 +1138,13 @@ buf0 = buf; - if ((sc->sc_cmd_data[1] & ~0x08) != 0) { + if ((sc->sc_cbw->CBWCDB[1] & ~0x08) != 0) { /* Mask away DBD */ currlun->sense_data = SS_INVALID_FIELD_IN_CDB; return (1); } - pc = sc->sc_cmd_data[2] >> 6; - page_code = sc->sc_cmd_data[2] & 0x3f; + pc = sc->sc_cbw->CBWCDB[2] >> 6; + page_code = sc->sc_cbw->CBWCDB[2] & 0x3f; if (pc == 3) { currlun->sense_data = SS_SAVING_PARAMETERS_NOT_SUPPORTED; return (1); @@ -1237,9 +1241,9 @@ currlun->sense_data = SS_INVALID_COMMAND; return (1); } - immed = sc->sc_cmd_data[1] & 0x01; - loej = sc->sc_cmd_data[4] & 0x02; - start = sc->sc_cmd_data[4] & 0x01; + immed = sc->sc_cbw->CBWCDB[1] & 0x01; + loej = sc->sc_cbw->CBWCDB[4] & 0x02; + start = sc->sc_cbw->CBWCDB[4] & 0x01; if (immed || loej || start) { /* compile fix */ @@ -1264,8 +1268,8 @@ currlun->sense_data = SS_INVALID_COMMAND; return (1); } - prevent = sc->sc_cmd_data[4] & 0x01; - if ((sc->sc_cmd_data[4] & ~0x01) != 0) { + prevent = sc->sc_cbw->CBWCDB[4] & 0x01; + if ((sc->sc_cbw->CBWCDB[4] & ~0x01) != 0) { /* Mask away Prevent */ currlun->sense_data = SS_INVALID_FIELD_IN_CDB; return (1); @@ -1369,18 +1373,18 @@ * Get the starting Logical Block Address and check that it's not * too big */ - if (sc->sc_cmd_data[0] == SC_READ_6) { - lba = (((uint32_t)sc->sc_cmd_data[1]) << 16) | - get_be16(&sc->sc_cmd_data[2]); + if (sc->sc_cbw->CBWCDB[0] == SC_READ_6) { + lba = (((uint32_t)sc->sc_cbw->CBWCDB[1]) << 16) | + get_be16(&sc->sc_cbw->CBWCDB[2]); } else { - lba = get_be32(&sc->sc_cmd_data[2]); + lba = get_be32(&sc->sc_cbw->CBWCDB[2]); /* * We allow DPO (Disable Page Out = don't save data in the * cache) and FUA (Force Unit Access = don't read from the * cache), but we don't implement them. */ - if ((sc->sc_cmd_data[1] & ~0x18) != 0) { + if ((sc->sc_cbw->CBWCDB[1] & ~0x18) != 0) { currlun->sense_data = SS_INVALID_FIELD_IN_CDB; return (1); } @@ -1427,11 +1431,11 @@ * Get the starting Logical Block Address and check that it's not * too big. */ - if (sc->sc_cmd_data[0] == SC_WRITE_6) - lba = (((uint32_t)sc->sc_cmd_data[1]) << 16) | - get_be16(&sc->sc_cmd_data[2]); + if (sc->sc_cbw->CBWCDB[0] == SC_WRITE_6) + lba = (((uint32_t)sc->sc_cbw->CBWCDB[1]) << 16) | + get_be16(&sc->sc_cbw->CBWCDB[2]); else { - lba = get_be32(&sc->sc_cmd_data[2]); + lba = get_be32(&sc->sc_cbw->CBWCDB[2]); /* * We allow DPO (Disable Page Out = don't save data in the @@ -1439,11 +1443,11 @@ * medium). We don't implement DPO; we implement FUA by * performing synchronous output. */ - if ((sc->sc_cmd_data[1] & ~0x18) != 0) { + if ((sc->sc_cbw->CBWCDB[1] & ~0x18) != 0) { currlun->sense_data = SS_INVALID_FIELD_IN_CDB; return (1); } - if (sc->sc_cmd_data[1] & 0x08) { + if (sc->sc_cbw->CBWCDB[1] & 0x08) { /* FUA */ /* XXX set SYNC flag here */ } @@ -1483,7 +1487,7 @@ * there must be something wrong about this SCSI * command */ - sc->sc_csw.bCSWStatus = CSWSTATUS_PHASE; + sc->sc_csw->bCSWStatus = CSWSTATUS_PHASE; return (1); } /* compute the minimum length */ @@ -1519,18 +1523,18 @@ uint16_t mask, uint8_t needs_medium) { struct ustorage_fs_lun *currlun; - uint8_t lun = (sc->sc_cmd_data[1] >> 5); + uint8_t lun = (sc->sc_cbw->CBWCDB[1] >> 5); uint8_t i; /* Verify the length of the command itself */ if (min_cmd_size > sc->sc_transfer.cmd_len) { DPRINTF("%u > %u\n", min_cmd_size, sc->sc_transfer.cmd_len); - sc->sc_csw.bCSWStatus = CSWSTATUS_PHASE; + sc->sc_csw->bCSWStatus = CSWSTATUS_PHASE; return (1); } /* Mask away the LUN */ - sc->sc_cmd_data[1] &= 0x1f; + sc->sc_cbw->CBWCDB[1] &= 0x1f; /* Check if LUN is correct */ if (lun != sc->sc_transfer.lun) { @@ -1540,7 +1544,7 @@ if (sc->sc_transfer.lun <= sc->sc_last_lun) { sc->sc_transfer.currlun = currlun = sc->sc_lun + sc->sc_transfer.lun; - if (sc->sc_cmd_data[0] != SC_REQUEST_SENSE) { + if (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE) { currlun->sense_data = SS_NO_SENSE; currlun->sense_data_info = 0; currlun->info_valid = 0; @@ -1551,8 +1555,8 @@ * else must fail! */ if ((currlun->unit_attention_data != SS_NO_SENSE) && - (sc->sc_cmd_data[0] != SC_INQUIRY) && - (sc->sc_cmd_data[0] != SC_REQUEST_SENSE)) { + (sc->sc_cbw->CBWCDB[0] != SC_INQUIRY) && + (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE)) { currlun->sense_data = currlun->unit_attention_data; currlun->unit_attention_data = SS_NO_SENSE; return (1); @@ -1564,8 +1568,8 @@ * INQUIRY and REQUEST SENSE commands are explicitly allowed * to use unsupported LUNs; all others may not. */ - if ((sc->sc_cmd_data[0] != SC_INQUIRY) && - (sc->sc_cmd_data[0] != SC_REQUEST_SENSE)) { + if ((sc->sc_cbw->CBWCDB[0] != SC_INQUIRY) && + (sc->sc_cbw->CBWCDB[0] != SC_REQUEST_SENSE)) { return (1); } } @@ -1575,7 +1579,7 @@ * non-zero. */ for (i = 0; i != min_cmd_size; i++) { - if (sc->sc_cmd_data[i] && !(mask & (1UL << i))) { + if (sc->sc_cbw->CBWCDB[i] && !(mask & (1UL << i))) { if (currlun) { currlun->sense_data = SS_INVALID_FIELD_IN_CDB; } @@ -1613,12 +1617,12 @@ sc->sc_transfer.data_ptr = sc->sc_qdata; DPRINTF("cmd_data[0]=0x%02x, data_rem=0x%08x\n", - sc->sc_cmd_data[0], sc->sc_transfer.data_rem); + sc->sc_cbw->CBWCDB[0], sc->sc_transfer.data_rem); - switch (sc->sc_cmd_data[0]) { + switch (sc->sc_cbw->CBWCDB[0]) { case SC_INQUIRY: sc->sc_transfer.cmd_dir = DIR_WRITE; - error = ustorage_fs_min_len(sc, sc->sc_cmd_data[4], -1U); + error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U); if (error) { break; } @@ -1633,7 +1637,7 @@ case SC_MODE_SELECT_6: sc->sc_transfer.cmd_dir = DIR_READ; - error = ustorage_fs_min_len(sc, sc->sc_cmd_data[4], -1U); + error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U); if (error) { break; } @@ -1649,7 +1653,7 @@ case SC_MODE_SELECT_10: sc->sc_transfer.cmd_dir = DIR_READ; error = ustorage_fs_min_len(sc, - get_be16(&sc->sc_cmd_data[7]), -1U); + get_be16(&sc->sc_cbw->CBWCDB[7]), -1U); if (error) { break; } @@ -1664,7 +1668,7 @@ case SC_MODE_SENSE_6: sc->sc_transfer.cmd_dir = DIR_WRITE; - error = ustorage_fs_min_len(sc, sc->sc_cmd_data[4], -1U); + error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U); if (error) { break; } @@ -1680,7 +1684,7 @@ case SC_MODE_SENSE_10: sc->sc_transfer.cmd_dir = DIR_WRITE; error = ustorage_fs_min_len(sc, - get_be16(&sc->sc_cmd_data[7]), -1U); + get_be16(&sc->sc_cbw->CBWCDB[7]), -1U); if (error) { break; } @@ -1708,7 +1712,7 @@ break; case SC_READ_6: - i = sc->sc_cmd_data[4]; + i = sc->sc_cbw->CBWCDB[4]; sc->sc_transfer.cmd_dir = DIR_WRITE; temp = ((i == 0) ? 256UL : i); error = ustorage_fs_min_len(sc, temp << 9, mask9); @@ -1726,7 +1730,7 @@ case SC_READ_10: sc->sc_transfer.cmd_dir = DIR_WRITE; - temp = get_be16(&sc->sc_cmd_data[7]); + temp = get_be16(&sc->sc_cbw->CBWCDB[7]); error = ustorage_fs_min_len(sc, temp << 9, mask9); if (error) { break; @@ -1742,10 +1746,10 @@ case SC_READ_12: sc->sc_transfer.cmd_dir = DIR_WRITE; - temp = get_be32(&sc->sc_cmd_data[6]); + temp = get_be32(&sc->sc_cbw->CBWCDB[6]); if (temp >= (1UL << (32 - 9))) { /* numerical overflow */ - sc->sc_csw.bCSWStatus = CSWSTATUS_FAILED; + sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED; error = 1; break; } @@ -1776,7 +1780,7 @@ case SC_READ_FORMAT_CAPACITIES: sc->sc_transfer.cmd_dir = DIR_WRITE; error = ustorage_fs_min_len(sc, - get_be16(&sc->sc_cmd_data[7]), -1U); + get_be16(&sc->sc_cbw->CBWCDB[7]), -1U); if (error) { break; } @@ -1791,7 +1795,7 @@ case SC_REQUEST_SENSE: sc->sc_transfer.cmd_dir = DIR_WRITE; - error = ustorage_fs_min_len(sc, sc->sc_cmd_data[4], -1U); + error = ustorage_fs_min_len(sc, sc->sc_cbw->CBWCDB[4], -1U); if (error) { break; } @@ -1860,7 +1864,7 @@ break; case SC_WRITE_6: - i = sc->sc_cmd_data[4]; + i = sc->sc_cbw->CBWCDB[4]; sc->sc_transfer.cmd_dir = DIR_READ; temp = ((i == 0) ? 256UL : i); error = ustorage_fs_min_len(sc, temp << 9, mask9); @@ -1878,7 +1882,7 @@ case SC_WRITE_10: sc->sc_transfer.cmd_dir = DIR_READ; - temp = get_be16(&sc->sc_cmd_data[7]); + temp = get_be16(&sc->sc_cbw->CBWCDB[7]); error = ustorage_fs_min_len(sc, temp << 9, mask9); if (error) { break; @@ -1894,10 +1898,10 @@ case SC_WRITE_12: sc->sc_transfer.cmd_dir = DIR_READ; - temp = get_be32(&sc->sc_cmd_data[6]); + temp = get_be32(&sc->sc_cbw->CBWCDB[6]); if (temp > (mask9 >> 9)) { /* numerical overflow */ - sc->sc_csw.bCSWStatus = CSWSTATUS_FAILED; + sc->sc_csw->bCSWStatus = CSWSTATUS_FAILED; error = 1; break; } === dev/usb/usb_msctest.c ================================================================== --- dev/usb/usb_msctest.c (revision 244051) +++ dev/usb/usb_msctest.c (local) @@ -139,8 +139,8 @@ struct bbb_transfer { struct mtx mtx; struct cv cv; - struct bbb_cbw cbw; - struct bbb_csw csw; + struct bbb_cbw *cbw; + struct bbb_csw *csw; struct usb_xfer *xfer[ST_MAX]; @@ -158,7 +158,7 @@ uint8_t status_try; int error; - uint8_t buffer[SCSI_MAX_LEN] __aligned(4); + uint8_t *buffer; }; static usb_callback_t bbb_command_callback; @@ -184,7 +184,6 @@ .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, .bufsize = sizeof(struct bbb_cbw), - .flags = {.ext_buffer = 1,}, .callback = &bbb_command_callback, .timeout = 4 * USB_MS_HZ, /* 4 seconds */ }, @@ -193,8 +192,8 @@ .type = UE_BULK, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, - .bufsize = BULK_SIZE, - .flags = {.ext_buffer = 1,.proxy_buffer = 1,.short_xfer_ok = 1,}, + .bufsize = MAX(SCSI_MAX_LEN, BULK_SIZE), + .flags = {.proxy_buffer = 1,.short_xfer_ok = 1,}, .callback = &bbb_data_read_callback, .timeout = 4 * USB_MS_HZ, /* 4 seconds */ }, @@ -232,7 +231,7 @@ .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, .bufsize = sizeof(struct bbb_csw), - .flags = {.ext_buffer = 1,.short_xfer_ok = 1,}, + .flags = {.short_xfer_ok = 1,}, .callback = &bbb_status_callback, .timeout = 1 * USB_MS_HZ, /* 1 second */ }, @@ -241,7 +240,6 @@ static void bbb_done(struct bbb_transfer *sc, int error) { - sc->error = error; sc->state = ST_COMMAND; sc->status_try = 1; @@ -290,18 +288,17 @@ case USB_ST_SETUP: sc->status_try = 0; - tag = UGETDW(sc->cbw.dCBWTag) + 1; - USETDW(sc->cbw.dCBWSignature, CBWSIGNATURE); - USETDW(sc->cbw.dCBWTag, tag); - USETDW(sc->cbw.dCBWDataTransferLength, (uint32_t)sc->data_len); - sc->cbw.bCBWFlags = ((sc->dir == DIR_IN) ? CBWFLAGS_IN : CBWFLAGS_OUT); - sc->cbw.bCBWLUN = sc->lun; - sc->cbw.bCDBLength = sc->cmd_len; - if (sc->cbw.bCDBLength > sizeof(sc->cbw.CBWCDB)) { - sc->cbw.bCDBLength = sizeof(sc->cbw.CBWCDB); + tag = UGETDW(sc->cbw->dCBWTag) + 1; + USETDW(sc->cbw->dCBWSignature, CBWSIGNATURE); + USETDW(sc->cbw->dCBWTag, tag); + USETDW(sc->cbw->dCBWDataTransferLength, (uint32_t)sc->data_len); + sc->cbw->bCBWFlags = ((sc->dir == DIR_IN) ? CBWFLAGS_IN : CBWFLAGS_OUT); + sc->cbw->bCBWLUN = sc->lun; + sc->cbw->bCDBLength = sc->cmd_len; + if (sc->cbw->bCDBLength > sizeof(sc->cbw->CBWCDB)) { + sc->cbw->bCDBLength = sizeof(sc->cbw->CBWCDB); DPRINTFN(0, "Truncating long command\n"); } - usbd_xfer_set_frame_data(xfer, 0, &sc->cbw, sizeof(sc->cbw)); usbd_transfer_submit(xfer); break; @@ -430,9 +427,9 @@ /* very simple status check */ - if (actlen < (int)sizeof(sc->csw)) { + if (actlen < (int)sizeof(struct bbb_csw)) { bbb_done(sc, USB_ERR_SHORT_XFER); - } else if (sc->csw.bCSWStatus == CSWSTATUS_GOOD) { + } else if (sc->csw->bCSWStatus == CSWSTATUS_GOOD) { bbb_done(sc, 0); /* success */ } else { bbb_done(sc, ERR_CSW_FAILED); /* error */ @@ -440,7 +437,6 @@ break; case USB_ST_SETUP: - usbd_xfer_set_frame_data(xfer, 0, &sc->csw, sizeof(sc->csw)); usbd_transfer_submit(xfer); break; @@ -478,9 +474,9 @@ sc->data_timeout = (data_timeout + USB_MS_HZ); sc->actlen = 0; sc->cmd_len = cmd_len; - memset(&sc->cbw.CBWCDB, 0, sizeof(sc->cbw.CBWCDB)); - memcpy(&sc->cbw.CBWCDB, cmd_ptr, cmd_len); - DPRINTFN(1, "SCSI cmd = %*D\n", (int)cmd_len, (char *)sc->cbw.CBWCDB, ":"); + memset(&sc->cbw->CBWCDB, 0, sizeof(sc->cbw->CBWCDB)); + memcpy(&sc->cbw->CBWCDB, cmd_ptr, cmd_len); + DPRINTFN(1, "SCSI cmd = %*D\n", (int)cmd_len, (char *)sc->cbw->CBWCDB, ":"); mtx_lock(&sc->mtx); usbd_transfer_start(sc->xfer[sc->state]); @@ -554,6 +550,14 @@ bbb_detach(sc); return (NULL); } + /* store pointer to DMA buffers */ + sc->buffer = usbd_xfer_get_frame_buffer( + sc->xfer[ST_DATA_RD], 0); + sc->cbw = usbd_xfer_get_frame_buffer( + sc->xfer[ST_COMMAND], 0); + sc->csw = usbd_xfer_get_frame_buffer( + sc->xfer[ST_STATUS], 0); + return (sc); } === dev/usb/usb_transfer.c ================================================================== --- dev/usb/usb_transfer.c (revision 244051) +++ dev/usb/usb_transfer.c (local) @@ -688,12 +688,30 @@ */ if (!xfer->flags.ext_buffer) { +#if USB_HAVE_BUSDMA + struct usb_page_search page_info; + struct usb_page_cache *pc; + if (usbd_transfer_setup_sub_malloc(parm, + &pc, parm->bufsize, 1, 1)) { + parm->err = USB_ERR_NOMEM; + } else if (parm->buf != NULL) { + + usbd_get_page(pc, 0, &page_info); + + xfer->local_buffer = page_info.buffer; + + usbd_xfer_set_frame_offset(xfer, 0, 0); + + if ((type == UE_CONTROL) && (n_frbuffers > 1)) { + usbd_xfer_set_frame_offset(xfer, REQ_SIZE, 1); + } + } +#else /* align data */ parm->size[0] += ((-parm->size[0]) & (USB_HOST_ALIGN - 1)); - if (parm->buf) { - + if (parm->buf != NULL) { xfer->local_buffer = USB_ADD_BYTES(parm->buf, parm->size[0]); @@ -707,6 +725,7 @@ /* align data again */ parm->size[0] += ((-parm->size[0]) & (USB_HOST_ALIGN - 1)); +#endif } /* * Compute maximum buffer size @@ -1078,9 +1097,12 @@ * The number of DMA tags required depends on * the number of endpoints. The current estimate * for maximum number of DMA tags per endpoint - * is two. + * is three: + * 1) for loading memory + * 2) for allocating memory + * 3) for fixing memory [UHCI] */ - parm.dma_tag_max += 2 * MIN(n_setup, USB_EP_MAX); + parm.dma_tag_max += 3 * MIN(n_setup, USB_EP_MAX); /* * DMA tags for QH, TD, Data and more. @@ -1943,6 +1965,17 @@ return (&xfer->frbuffers[frindex]); } +void * +usbd_xfer_get_frame_buffer(struct usb_xfer *xfer, usb_frcount_t frindex) +{ + struct usb_page_search page_info; + + KASSERT(frindex < xfer->max_frame_count, ("frame index overflow")); + + usbd_get_page(&xfer->frbuffers[frindex], 0, &page_info); + return (page_info.buffer); +} + /*------------------------------------------------------------------------* * usbd_xfer_get_fps_shift * === dev/usb/usbdi.h ================================================================== --- dev/usb/usbdi.h (revision 244051) +++ dev/usb/usbdi.h (local) @@ -530,8 +530,8 @@ usbd_xfer_old_frame_length(struct usb_xfer *xfer, usb_frcount_t frindex); void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes); -struct usb_page_cache *usbd_xfer_get_frame(struct usb_xfer *xfer, - usb_frcount_t frindex); +struct usb_page_cache *usbd_xfer_get_frame(struct usb_xfer *, usb_frcount_t); +void *usbd_xfer_get_frame_buffer(struct usb_xfer *, usb_frcount_t); void *usbd_xfer_softc(struct usb_xfer *xfer); void *usbd_xfer_get_priv(struct usb_xfer *xfer); void usbd_xfer_set_priv(struct usb_xfer *xfer, void *); === dev/usb/wlan/if_uath.c ================================================================== --- dev/usb/wlan/if_uath.c (revision 244051) +++ dev/usb/wlan/if_uath.c (local) @@ -217,9 +217,8 @@ .type = UE_BULK, .endpoint = 0x1, .direction = UE_DIR_OUT, - .bufsize = UATH_MAX_CMDSZ, + .bufsize = UATH_MAX_CMDSZ * UATH_CMD_LIST_COUNT, .flags = { - .ext_buffer = 1, .force_short_xfer = 1, .pipe_bof = 1, }, @@ -242,9 +241,8 @@ .type = UE_BULK, .endpoint = 0x2, .direction = UE_DIR_OUT, - .bufsize = UATH_MAX_TXBUFSZ, + .bufsize = UATH_MAX_TXBUFSZ * UATH_TX_DATA_LIST_COUNT, .flags = { - .ext_buffer = 1, .force_short_xfer = 1, .pipe_bof = 1 }, @@ -258,10 +256,8 @@ const uint8_t [IEEE80211_ADDR_LEN], const uint8_t [IEEE80211_ADDR_LEN]); static void uath_vap_delete(struct ieee80211vap *); -static int uath_alloc_cmd_list(struct uath_softc *, struct uath_cmd [], - int, int); -static void uath_free_cmd_list(struct uath_softc *, struct uath_cmd [], - int); +static int uath_alloc_cmd_list(struct uath_softc *, struct uath_cmd []); +static void uath_free_cmd_list(struct uath_softc *, struct uath_cmd []); static int uath_host_available(struct uath_softc *); static int uath_get_capability(struct uath_softc *, uint32_t, uint32_t *); static int uath_get_devcap(struct uath_softc *); @@ -365,8 +361,7 @@ /* * Allocate xfers for firmware commands. */ - error = uath_alloc_cmd_list(sc, sc->sc_cmd, UATH_CMD_LIST_COUNT, - UATH_MAX_CMDSZ); + error = uath_alloc_cmd_list(sc, sc->sc_cmd); if (error != 0) { device_printf(sc->sc_dev, "could not allocate Tx command list\n"); @@ -381,6 +376,11 @@ goto fail1; } + sc->sc_cmd_dma_buf = + usbd_xfer_get_frame_buffer(sc->sc_xfer[UATH_INTR_TX], 0); + sc->sc_tx_dma_buf = + usbd_xfer_get_frame_buffer(sc->sc_xfer[UATH_BULK_TX], 0); + /* * We're now ready to send+receive firmware commands. */ @@ -493,7 +493,7 @@ fail4: if_free(ifp); fail3: UATH_UNLOCK(sc); fail2: usbd_transfer_unsetup(sc->sc_xfer, UATH_N_XFERS); -fail1: uath_free_cmd_list(sc, sc->sc_cmd, UATH_CMD_LIST_COUNT); +fail1: uath_free_cmd_list(sc, sc->sc_cmd); fail: return (error); } @@ -524,7 +524,7 @@ UATH_LOCK(sc); uath_free_rx_data_list(sc); uath_free_tx_data_list(sc); - uath_free_cmd_list(sc, sc->sc_cmd, UATH_CMD_LIST_COUNT); + uath_free_cmd_list(sc, sc->sc_cmd); UATH_UNLOCK(sc); if_free(ifp); @@ -533,45 +533,35 @@ } static void -uath_free_cmd_list(struct uath_softc *sc, struct uath_cmd cmds[], int ncmd) +uath_free_cmd_list(struct uath_softc *sc, struct uath_cmd cmds[]) { int i; - for (i = 0; i < ncmd; i++) - if (cmds[i].buf != NULL) - free(cmds[i].buf, M_USBDEV); + for (i = 0; i != UATH_CMD_LIST_COUNT; i++) + cmds[i].buf = NULL; } static int -uath_alloc_cmd_list(struct uath_softc *sc, struct uath_cmd cmds[], - int ncmd, int maxsz) +uath_alloc_cmd_list(struct uath_softc *sc, struct uath_cmd cmds[]) { - int i, error; + int i; STAILQ_INIT(&sc->sc_cmd_active); STAILQ_INIT(&sc->sc_cmd_pending); STAILQ_INIT(&sc->sc_cmd_waiting); STAILQ_INIT(&sc->sc_cmd_inactive); - for (i = 0; i < ncmd; i++) { + for (i = 0; i != UATH_CMD_LIST_COUNT; i++) { struct uath_cmd *cmd = &cmds[i]; cmd->sc = sc; /* backpointer for callbacks */ cmd->msgid = i; - cmd->buf = malloc(maxsz, M_USBDEV, M_NOWAIT); - if (cmd->buf == NULL) { - device_printf(sc->sc_dev, - "could not allocate xfer buffer\n"); - error = ENOMEM; - goto fail; - } + cmd->buf = ((uint8_t *)sc->sc_cmd_dma_buf) + + (i * UATH_MAX_CMDSZ); STAILQ_INSERT_TAIL(&sc->sc_cmd_inactive, cmd, next); UATH_STAT_INC(sc, st_cmd_inactive); } return (0); - -fail: uath_free_cmd_list(sc, cmds, ncmd); - return (error); } static int @@ -942,10 +932,7 @@ dp->buf = NULL; } } else { - if (dp->buf != NULL) { - free(dp->buf, M_USBDEV); - dp->buf = NULL; - } + dp->buf = NULL; } #ifdef UATH_DEBUG if (dp->ni != NULL) @@ -956,7 +943,7 @@ static int uath_alloc_data_list(struct uath_softc *sc, struct uath_data data[], - int ndata, int maxsz, int fillmbuf) + int ndata, int maxsz, void *dma_buf) { int i, error; @@ -964,7 +951,7 @@ struct uath_data *dp = &data[i]; dp->sc = sc; - if (fillmbuf) { + if (dma_buf == NULL) { /* XXX check maxsz */ dp->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); if (dp->m == NULL) { @@ -976,20 +963,14 @@ dp->buf = mtod(dp->m, uint8_t *); } else { dp->m = NULL; - dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT); - if (dp->buf == NULL) { - device_printf(sc->sc_dev, - "could not allocate buffer\n"); - error = ENOMEM; - goto fail; - } + dp->buf = ((uint8_t *)dma_buf) + (i * maxsz); } dp->ni = NULL; } return (0); -fail: uath_free_data_list(sc, data, ndata, fillmbuf); +fail: uath_free_data_list(sc, data, ndata, 1 /* free mbufs */); return (error); } @@ -1001,7 +982,7 @@ /* XXX is it enough to store the RX packet with MCLBYTES bytes? */ error = uath_alloc_data_list(sc, sc->sc_rx, UATH_RX_DATA_LIST_COUNT, MCLBYTES, - 1 /* setup mbufs */); + NULL /* setup mbufs */); if (error != 0) return (error); @@ -1024,7 +1005,7 @@ error = uath_alloc_data_list(sc, sc->sc_tx, UATH_TX_DATA_LIST_COUNT, UATH_MAX_TXBUFSZ, - 0 /* no mbufs */); + sc->sc_tx_dma_buf); if (error != 0) return (error); @@ -2741,8 +2722,7 @@ UATH_STAT_DEC(sc, st_rx_inactive); STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); UATH_STAT_INC(sc, st_rx_active); - usbd_xfer_set_frame_data(xfer, 0, data->buf, - usbd_xfer_max_len(xfer)); + usbd_xfer_set_frame_data(xfer, 0, data->buf, MCLBYTES); usbd_transfer_submit(xfer); /* === dev/usb/wlan/if_uathvar.h ================================================================== --- dev/usb/wlan/if_uathvar.h (revision 244051) +++ dev/usb/wlan/if_uathvar.h (local) @@ -186,6 +186,8 @@ struct ifnet *sc_ifp; device_t sc_dev; struct usb_device *sc_udev; + void *sc_cmd_dma_buf; + void *sc_tx_dma_buf; struct mtx sc_mtx; uint32_t sc_debug; === dev/usb/wlan/if_upgt.c ================================================================== --- dev/usb/wlan/if_upgt.c (revision 244051) +++ dev/usb/wlan/if_upgt.c (local) @@ -201,9 +201,8 @@ .type = UE_BULK, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_OUT, - .bufsize = MCLBYTES, + .bufsize = MCLBYTES * UPGT_TX_MAXCOUNT, .flags = { - .ext_buffer = 1, .force_short_xfer = 1, .pipe_bof = 1 }, @@ -214,9 +213,8 @@ .type = UE_BULK, .endpoint = UE_ADDR_ANY, .direction = UE_DIR_IN, - .bufsize = MCLBYTES, + .bufsize = MCLBYTES * UPGT_RX_MAXCOUNT, .flags = { - .ext_buffer = 1, .pipe_bof = 1, .short_xfer_ok = 1 }, @@ -277,6 +275,11 @@ goto fail3; } + sc->sc_rx_dma_buf = usbd_xfer_get_frame_buffer( + sc->sc_xfer[UPGT_BULK_RX], 0); + sc->sc_tx_dma_buf = usbd_xfer_get_frame_buffer( + sc->sc_xfer[UPGT_BULK_TX], 0); + ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); if (ifp == NULL) { device_printf(dev, "can not if_alloc()\n"); @@ -1952,13 +1955,7 @@ for (i = 0; i < UPGT_TX_MAXCOUNT; i++) { struct upgt_data *data = &sc->sc_tx_data[i]; - - data->buf = malloc(MCLBYTES, M_USBDEV, M_NOWAIT | M_ZERO); - if (data->buf == NULL) { - device_printf(sc->sc_dev, - "could not allocate TX buffer\n"); - return (ENOMEM); - } + data->buf = ((uint8_t *)sc->sc_tx_dma_buf) + (i * MCLBYTES); STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); UPGT_STAT_INC(sc, st_tx_inactive); } @@ -1976,13 +1973,7 @@ for (i = 0; i < UPGT_RX_MAXCOUNT; i++) { struct upgt_data *data = &sc->sc_rx_data[i]; - - data->buf = malloc(MCLBYTES, M_USBDEV, M_NOWAIT | M_ZERO); - if (data->buf == NULL) { - device_printf(sc->sc_dev, - "could not allocate RX buffer\n"); - return (ENOMEM); - } + data->buf = ((uint8_t *)sc->sc_rx_dma_buf) + (i * MCLBYTES); STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); } @@ -2023,7 +2014,7 @@ for (i = 0; i < UPGT_RX_MAXCOUNT; i++) { struct upgt_data *data = &sc->sc_rx_data[i]; - free(data->buf, M_USBDEV); + data->buf = NULL; data->ni = NULL; } } @@ -2036,7 +2027,7 @@ for (i = 0; i < UPGT_TX_MAXCOUNT; i++) { struct upgt_data *data = &sc->sc_tx_data[i]; - free(data->buf, M_USBDEV); + data->buf = NULL; data->ni = NULL; } } @@ -2278,8 +2269,7 @@ return; STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next); STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); - usbd_xfer_set_frame_data(xfer, 0, data->buf, - usbd_xfer_max_len(xfer)); + usbd_xfer_set_frame_data(xfer, 0, data->buf, MCLBYTES); usbd_transfer_submit(xfer); /* === dev/usb/wlan/if_upgtvar.h ================================================================== --- dev/usb/wlan/if_upgtvar.h (revision 244051) +++ dev/usb/wlan/if_upgtvar.h (local) @@ -422,6 +422,8 @@ device_t sc_dev; struct ifnet *sc_ifp; struct usb_device *sc_udev; + void *sc_rx_dma_buf; + void *sc_tx_dma_buf; struct mtx sc_mtx; struct upgt_stat sc_stat; int sc_flags; === dev/usb/wlan/if_urtw.c ================================================================== --- dev/usb/wlan/if_urtw.c (revision 244051) +++ dev/usb/wlan/if_urtw.c (local) @@ -532,9 +532,8 @@ .type = UE_BULK, .endpoint = 0x89, .direction = UE_DIR_IN, - .bufsize = MCLBYTES, + .bufsize = sizeof(uint64_t), .flags = { - .ext_buffer = 1, .pipe_bof = 1, .short_xfer_ok = 1 }, @@ -544,9 +543,8 @@ .type = UE_BULK, .endpoint = URTW_8187B_TXPIPE_BE, .direction = UE_DIR_OUT, - .bufsize = URTW_TX_MAXSIZE, + .bufsize = URTW_TX_MAXSIZE * URTW_TX_DATA_LIST_COUNT, .flags = { - .ext_buffer = 1, .force_short_xfer = 1, .pipe_bof = 1, }, @@ -624,9 +622,8 @@ .type = UE_BULK, .endpoint = 0x2, .direction = UE_DIR_OUT, - .bufsize = URTW_TX_MAXSIZE, + .bufsize = URTW_TX_MAXSIZE * URTW_TX_DATA_LIST_COUNT, .flags = { - .ext_buffer = 1, .force_short_xfer = 1, .pipe_bof = 1, }, @@ -827,6 +824,16 @@ goto fail0; } + if (sc->sc_flags & URTW_RTL8187B) { + sc->sc_tx_dma_buf = + usbd_xfer_get_frame_buffer(sc->sc_xfer[ + URTW_8187B_BULK_TX_BE], 0); + } else { + sc->sc_tx_dma_buf = + usbd_xfer_get_frame_buffer(sc->sc_xfer[ + URTW_8187L_BULK_TX_LOW], 0); + } + URTW_LOCK(sc); urtw_read32_m(sc, URTW_RX, &data); @@ -980,10 +987,7 @@ dp->buf = NULL; } } else { - if (dp->buf != NULL) { - free(dp->buf, M_USBDEV); - dp->buf = NULL; - } + dp->buf = NULL; } if (dp->ni != NULL) { ieee80211_free_node(dp->ni); @@ -1449,7 +1453,7 @@ static int urtw_alloc_data_list(struct urtw_softc *sc, struct urtw_data data[], - int ndata, int maxsz, int fillmbuf) + int ndata, int maxsz, void *dma_buf) { int i, error; @@ -1457,7 +1461,7 @@ struct urtw_data *dp = &data[i]; dp->sc = sc; - if (fillmbuf) { + if (dma_buf == NULL) { dp->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); if (dp->m == NULL) { device_printf(sc->sc_dev, @@ -1468,24 +1472,15 @@ dp->buf = mtod(dp->m, uint8_t *); } else { dp->m = NULL; - dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT); - if (dp->buf == NULL) { - device_printf(sc->sc_dev, - "could not allocate buffer\n"); - error = ENOMEM; - goto fail; - } - if (((unsigned long)dp->buf) % 4) - device_printf(sc->sc_dev, - "warn: unaligned buffer %p\n", dp->buf); + dp->buf = ((uint8_t *)dma_buf) + + (i * maxsz); } dp->ni = NULL; } + return (0); - return 0; - -fail: urtw_free_data_list(sc, data, ndata, fillmbuf); - return error; +fail: urtw_free_data_list(sc, data, ndata, 1); + return (error); } static int @@ -1494,7 +1489,8 @@ int error, i; error = urtw_alloc_data_list(sc, - sc->sc_rx, URTW_RX_DATA_LIST_COUNT, MCLBYTES, 1 /* mbufs */); + sc->sc_rx, URTW_RX_DATA_LIST_COUNT, + MCLBYTES, NULL /* mbufs */); if (error != 0) return (error); @@ -1514,7 +1510,7 @@ error = urtw_alloc_data_list(sc, sc->sc_tx, URTW_TX_DATA_LIST_COUNT, URTW_TX_MAXSIZE, - 0 /* no mbufs */); + sc->sc_tx_dma_buf /* no mbufs */); if (error != 0) return (error); @@ -2709,42 +2705,28 @@ return (error); } -/* XXX why we should allocalte memory buffer instead of using memory stack? */ static usb_error_t urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index, uint16_t *data) { - uint8_t *buf; + uint8_t buf[2]; uint16_t data16; - struct usb_device_request *req; + struct usb_device_request req; usb_error_t error = 0; data16 = *data; - req = (usb_device_request_t *)malloc(sizeof(usb_device_request_t), - M_80211_VAP, M_NOWAIT | M_ZERO); - if (req == NULL) { - device_printf(sc->sc_dev, "could not allocate a memory\n"); - goto fail0; - } - buf = (uint8_t *)malloc(2, M_80211_VAP, M_NOWAIT | M_ZERO); - if (req == NULL) { - device_printf(sc->sc_dev, "could not allocate a memory\n"); - goto fail1; - } - req->bmRequestType = UT_WRITE_VENDOR_DEVICE; - req->bRequest = URTW_8187_SETREGS_REQ; - USETW(req->wValue, addr); - USETW(req->wIndex, index); - USETW(req->wLength, sizeof(uint16_t)); + req.bmRequestType = UT_WRITE_VENDOR_DEVICE; + req.bRequest = URTW_8187_SETREGS_REQ; + USETW(req.wValue, addr); + USETW(req.wIndex, index); + USETW(req.wLength, sizeof(uint16_t)); buf[0] = (data16 & 0x00ff); buf[1] = (data16 & 0xff00) >> 8; - error = urtw_do_request(sc, req, buf); + error = urtw_do_request(sc, &req, buf); - free(buf, M_80211_VAP); -fail1: free(req, M_80211_VAP); -fail0: return (error); + return (error); } static usb_error_t @@ -4133,6 +4115,7 @@ { struct urtw_softc *sc = usbd_xfer_softc(xfer); struct ifnet *ifp = sc->sc_ifp; + void *dma_buf = usbd_xfer_get_frame_buffer(xfer, 0); URTW_ASSERT_LOCKED(sc); @@ -4142,8 +4125,7 @@ /* FALLTHROUGH */ case USB_ST_SETUP: setup: - usbd_xfer_set_frame_data(xfer, 0, &sc->sc_txstatus, - sizeof(int64_t)); + memcpy(dma_buf, &sc->sc_txstatus, sizeof(uint64_t)); usbd_transfer_submit(xfer); break; default: === dev/usb/wlan/if_urtwvar.h ================================================================== --- dev/usb/wlan/if_urtwvar.h (revision 244051) +++ dev/usb/wlan/if_urtwvar.h (local) @@ -97,6 +97,7 @@ device_t sc_dev; struct usb_device *sc_udev; struct mtx sc_mtx; + void *sc_tx_dma_buf; int sc_debug; int sc_if_flags; --Boundary-00=_Kuw0QlgeVxE9A/+-- From owner-freebsd-usb@FreeBSD.ORG Thu Dec 20 18:45:07 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6CE55477; Thu, 20 Dec 2012 18:45:07 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe04.c2i.net [212.247.154.98]) by mx1.freebsd.org (Postfix) with ESMTP id 609F68FC12; Thu, 20 Dec 2012 18:45:06 +0000 (UTC) X-T2-Spam-Status: No, hits=-0.2 required=5.0 tests=ALL_TRUSTED, BAYES_50 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe04.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 359428776; Thu, 20 Dec 2012 19:44:58 +0100 From: Hans Petter Selasky To: Warner Losh Subject: Re: EHCI on armv6 with Write-Back caches Date: Thu, 20 Dec 2012 19:46:34 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <20121218204931.5322922d@fubar.geek.nz> <201212190956.28609.hselasky@c2i.net> <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> In-Reply-To: <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212201946.34137.hselasky@c2i.net> Cc: Oleksandr Tymoshenko , freebsd-wireless@freebsd.org, Andrew Turner , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2012 18:45:07 -0000 Hi, I've run some basic tests over here (x86) which passed after some patch modifications. Please test and verify for your ARM targets: http://svnweb.freebsd.org/changeset/base/244500 http://svnweb.freebsd.org/changeset/base/244503 Please also verify that upgt and uwrt and uath still works like expected. --HPS From owner-freebsd-usb@FreeBSD.ORG Thu Dec 20 18:49:22 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 74AD94DE for ; Thu, 20 Dec 2012 18:49:22 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe03.c2i.net [212.247.154.66]) by mx1.freebsd.org (Postfix) with ESMTP id 02F7C8FC0C for ; Thu, 20 Dec 2012 18:49:21 +0000 (UTC) X-T2-Spam-Status: No, hits=-0.2 required=5.0 tests=ALL_TRUSTED, BAYES_50 Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe03.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 193442540; Thu, 20 Dec 2012 19:49:19 +0100 From: Hans Petter Selasky To: freebsd-usb@freebsd.org, David Subject: Re: usb/174575: Interrupt storm error on startup Date: Thu, 20 Dec 2012 19:50:55 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <201212191640.qBJGe2ZK096660@freefall.freebsd.org> In-Reply-To: <201212191640.qBJGe2ZK096660@freefall.freebsd.org> X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212201950.55042.hselasky@c2i.net> X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2012 18:49:22 -0000 Hi, There are some patches in the queue for the XHCI which are not in 9-stable, which might address this problem. If possible try to boot a 10-current live image as of today and see if there is any difference. --HPS From owner-freebsd-usb@FreeBSD.ORG Thu Dec 20 21:15:50 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E80156B8; Thu, 20 Dec 2012 21:15:50 +0000 (UTC) (envelope-from gonzo@id.bluezbox.com) Received: from id.bluezbox.com (id.bluezbox.com [88.198.91.248]) by mx1.freebsd.org (Postfix) with ESMTP id 8B6658FC12; Thu, 20 Dec 2012 21:15:50 +0000 (UTC) Received: from [88.198.91.248] (helo=[IPv6:::1]) by id.bluezbox.com with esmtpsa (TLSv1:CAMELLIA256-SHA:256) (Exim 4.77 (FreeBSD)) (envelope-from ) id 1TlnSr-000EvS-Ra; Thu, 20 Dec 2012 13:15:40 -0800 Message-ID: <50D37FF7.6000301@freebsd.org> Date: Thu, 20 Dec 2012 13:15:35 -0800 From: Oleksandr Tymoshenko User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Hans Petter Selasky Subject: Re: EHCI on armv6 with Write-Back caches References: <20121218204931.5322922d@fubar.geek.nz> <201212190956.28609.hselasky@c2i.net> <4A66C6C9-22EC-45AA-987D-49F958D7A8F9@bsdimp.com> <201212201946.34137.hselasky@c2i.net> In-Reply-To: <201212201946.34137.hselasky@c2i.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Sender: gonzo@id.bluezbox.com X-Spam-Level: -- X-Spam-Report: Spam detection software, running on the system "id.bluezbox.com", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see The administrator of that system for details. Content preview: On 12/20/2012 10:46 AM, Hans Petter Selasky wrote: > Hi, > > I've run some basic tests over here (x86) which passed after some patch > modifications. Please test and verify for your ARM targets: > > http://svnweb.freebsd.org/changeset/base/244500 > http://svnweb.freebsd.org/changeset/base/244503 > > Please also verify that upgt and uwrt and uath still works like expected. > [...] Content analysis details: (-2.9 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: freebsd-usb@freebsd.org, freebsd-wireless@freebsd.org, Andrew Turner X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2012 21:15:51 -0000 On 12/20/2012 10:46 AM, Hans Petter Selasky wrote: > Hi, > > I've run some basic tests over here (x86) which passed after some patch > modifications. Please test and verify for your ARM targets: > > http://svnweb.freebsd.org/changeset/base/244500 > http://svnweb.freebsd.org/changeset/base/244503 > > Please also verify that upgt and uwrt and uath still works like expected. > Thanks! I'll test umass on my ARM devices. EHCI driver suffers from this too. QH, QTD and other structures mixes DMA data and non-DMA fields. Splitting them would be a right thing to do too. Though I believe EHCI vs. WB caches issue is more complicated then just this. From owner-freebsd-usb@FreeBSD.ORG Fri Dec 21 07:15:59 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 26803ADB; Fri, 21 Dec 2012 07:15:59 +0000 (UTC) (envelope-from xiaofanc@gmail.com) Received: from mail-ea0-f169.google.com (mail-ea0-f169.google.com [209.85.215.169]) by mx1.freebsd.org (Postfix) with ESMTP id 839D08FC13; Fri, 21 Dec 2012 07:15:58 +0000 (UTC) Received: by mail-ea0-f169.google.com with SMTP id a12so1688719eaa.14 for ; Thu, 20 Dec 2012 23:15:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=p1rVESgO+2LKf1nD6EtIe7GaRgkQk8FBJN2HqlUalNY=; b=yGkpH+2rhjfKUAZkkukcOzTjVggreyUi9u9Chfa9BQMAUa6J2DIqjt9ZXbrnHrJL9m 9zIPcdxFbPuvp8PO1TCV4V7OiBPIfqyXg9fPxFXwNAxBPCVnmA36nXvSsOYb2+f7rJqM HA2HHU9/xXR243aPzKUATiOBDtzhzHoa5CJ2vspdAGyAcLyqBLpYgpGBucgag/ujq/Wg JV0mXngmh0DgSAbZj6viBvfIPyw7c/HPFiIu/KplXXG69jswe4UI/qaeS/Ktk+a5fs3K i6DmSKhJAmnNsIoPLkOvi+6jmDqD52cv2KVpHH7V274rpfYo3mYnyCMtNv1xbrkJrZHW CjMw== MIME-Version: 1.0 Received: by 10.14.174.198 with SMTP id x46mr29744759eel.23.1356074123415; Thu, 20 Dec 2012 23:15:23 -0800 (PST) Received: by 10.14.136.142 with HTTP; Thu, 20 Dec 2012 23:15:23 -0800 (PST) In-Reply-To: <201211171319.34781.hselasky@c2i.net> References: <201211162247.qAGMlTm2057387@red.freebsd.org> <201211171319.34781.hselasky@c2i.net> Date: Fri, 21 Dec 2012 15:15:23 +0800 Message-ID: Subject: Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD From: Xiaofan Chen To: Hans Petter Selasky Content-Type: text/plain; charset=ISO-8859-1 Cc: "Wojciech A. Koszek" , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Dec 2012 07:15:59 -0000 On Sat, Nov 17, 2012 at 8:19 PM, Hans Petter Selasky wrote: > On Friday 16 November 2012 23:47:29 Wojciech A. Koszek wrote: >> >Number: 173666 >> >Category: usb >> >Synopsis: [USB, LIBUSB] usb_reset() behavior different between >> >GNU/Linux and FreeBSD Confidential: no >> >Severity: non-critical >> >Priority: low >> >Responsible: freebsd-usb >> >State: open >> >Quarter: >> >Keywords: >> >Date-Required: >> >Class: sw-bug >> >Submitter-Id: current-users >> >Arrival-Date: Fri Nov 16 22:50:00 UTC 2012 >> >Closed-Date: >> >Last-Modified: >> >Originator: Wojciech A. Koszek >> >Release: 9.0-RELEASE >> >> >Organization: >> FreeBSD >> >> >Environment: >> FreeBSD seu 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:15:25 UTC >> 2012 root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 >> >> >Description: >> I have a driver written for libusb, which works fine under GNU/Linux and >> libusb. Device: >> >> gen0.2: at usbus0, cfg=0 md=HOST spd=LOW >> (1.5Mbps) pwr=ON >> >> (I used USB sniffer to uncover traffic based on what Windows was doing) >> >> Under Linux usb_reset()+usb_set_configuration() calls works fine. Under >> FreeBSD I have to disable calling usb_reset(), otherwise >> usb_set_configuration() fails with I/O error. >> > > According to: > > http://libusb.sourceforge.net/doc/function.usbreset.html > > What you describe is the expected behaviour. The above document is really meant for libusb-0.1 but the behavior of libusb-compat's usb_reset() is different since it is based on libusb-1.0's libusb_reset_device. http://git.libusb.org/?p=libusb-compat-0.1.git;a=blob;f=libusb/core.c 743 API_EXPORTED int usb_reset(usb_dev_handle *dev) 744 { 745 usbi_dbg(""); 746 return compat_err(libusb_reset_device(dev->handle)); 747 } For libusb-1.0 under Linux and Mac OS X, usually libusb_reset_device will not cause enumeration. Reference: http://libusb.6.n5.nabble.com/PATCH-make-libusb-reset-force-re-enumeration-on-Mac-td4499375.html http://libusb.sourceforge.net/api-1.0/group__dev.html#ga7321bd8dc28e9a20b411bf18e6d0e9aa int libusb_reset_device ( libusb_device_handle * dev ) Perform a USB port reset to reinitialize a device. The system will attempt to restore the previous configuration and alternate settings after the reset has completed. If the reset fails, the descriptors change, or the previous state cannot be restored, the device will appear to be disconnected and reconnected. This means that the device handle is no longer valid (you should close it) and rediscover the device. A return code of LIBUSB_ERROR_NOT_FOUND indicates when this is the case. This is a blocking function which usually incurs a noticeable delay. Parameters: dev a handle of the device to reset Returns: 0 on success LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device has been disconnected another LIBUSB_ERROR code on other failure -- Xiaofan From owner-freebsd-usb@FreeBSD.ORG Fri Dec 21 07:37:00 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6443AE72; Fri, 21 Dec 2012 07:37:00 +0000 (UTC) (envelope-from hselasky@c2i.net) Received: from swip.net (mailfe02.c2i.net [212.247.154.34]) by mx1.freebsd.org (Postfix) with ESMTP id 9D59B8FC15; Fri, 21 Dec 2012 07:36:58 +0000 (UTC) X-T2-Spam-Status: No, hits=-1.0 required=5.0 tests=ALL_TRUSTED Received: from [176.74.213.204] (account mc467741@c2i.net HELO laptop015.hselasky.homeunix.org) by mailfe02.swip.net (CommuniGate Pro SMTP 5.4.4) with ESMTPA id 361348592; Fri, 21 Dec 2012 08:36:56 +0100 From: Hans Petter Selasky To: Xiaofan Chen Subject: Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD Date: Fri, 21 Dec 2012 08:38:32 +0100 User-Agent: KMail/1.13.7 (FreeBSD/9.1-PRERELEASE; KDE/4.8.4; amd64; ; ) References: <201211162247.qAGMlTm2057387@red.freebsd.org> <201211171319.34781.hselasky@c2i.net> In-Reply-To: X-Face: 'mmZ:T{)),Oru^0c+/}w'`gU1$ubmG?lp!=R4Wy\ELYo2)@'UZ24N@d2+AyewRX}mAm; Yp |U[@, _z/([?1bCfM{_"B<.J>mICJCHAzzGHI{y7{%JVz%R~yJHIji`y>Y}k1C4TfysrsUI -%GU9V5]iUZF&nRn9mJ'?&>O MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201212210838.32260.hselasky@c2i.net> Cc: "Wojciech A. Koszek" , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Dec 2012 07:37:00 -0000 On Friday 21 December 2012 08:15:23 Xiaofan Chen wrote: > On Sat, Nov 17, 2012 at 8:19 PM, Hans Petter Selasky wrote: > > On Friday 16 November 2012 23:47:29 Wojciech A. Koszek wrote: > >> >Number: 173666 > >> >Category: usb > >> >Synopsis: [USB, LIBUSB] usb_reset() behavior different between > >> >GNU/Linux and FreeBSD Confidential: no > >> >Severity: non-critical > >> >Priority: low > >> >Responsible: freebsd-usb > >> >State: open > >> >Quarter: > >> >Keywords: > >> >Date-Required: > >> >Class: sw-bug > >> >Submitter-Id: current-users > >> >Arrival-Date: Fri Nov 16 22:50:00 UTC 2012 > >> >Closed-Date: > >> >Last-Modified: > >> >Originator: Wojciech A. Koszek > >> >Release: 9.0-RELEASE > >> > >> >Organization: > >> FreeBSD > >> > >> >Environment: > >> FreeBSD seu 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:15:25 UTC > >> 2012 root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386 > >> > >> >Description: > >> I have a driver written for libusb, which works fine under GNU/Linux and > >> libusb. Device: > >> > >> gen0.2: at usbus0, cfg=0 md=HOST > >> spd=LOW (1.5Mbps) pwr=ON > >> > >> (I used USB sniffer to uncover traffic based on what Windows was doing) > >> > >> Under Linux usb_reset()+usb_set_configuration() calls works fine. Under > >> FreeBSD I have to disable calling usb_reset(), otherwise > >> usb_set_configuration() fails with I/O error. > > > > According to: > > > > http://libusb.sourceforge.net/doc/function.usbreset.html > > > > What you describe is the expected behaviour. > > The above document is really meant for libusb-0.1 but the > behavior of libusb-compat's usb_reset() is different since > it is based on libusb-1.0's libusb_reset_device. > > http://git.libusb.org/?p=libusb-compat-0.1.git;a=blob;f=libusb/core.c > 743 API_EXPORTED int usb_reset(usb_dev_handle *dev) > 744 { > 745 usbi_dbg(""); > 746 return compat_err(libusb_reset_device(dev->handle)); > 747 } > > For libusb-1.0 under Linux and Mac OS X, usually > libusb_reset_device will not cause enumeration. > > Reference: > http://libusb.6.n5.nabble.com/PATCH-make-libusb-reset-force-re-enumeration- > on-Mac-td4499375.html > > http://libusb.sourceforge.net/api-1.0/group__dev.html#ga7321bd8dc28e9a20b41 > 1bf18e6d0e9aa > > int libusb_reset_device ( libusb_device_handle * dev ) > Perform a USB port reset to reinitialize a device. > > The system will attempt to restore the previous configuration and > alternate settings after the reset has completed. > > If the reset fails, the descriptors change, or the previous state > cannot be restored, the device will appear to be disconnected > and reconnected. This means that the device handle is no longer > valid (you should close it) and rediscover the device. A return code > of LIBUSB_ERROR_NOT_FOUND indicates when this is the case. > > This is a blocking function which usually incurs a noticeable delay. > > Parameters: > dev a handle of the device to reset > Returns: > 0 on success > LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the > device has been disconnected > another LIBUSB_ERROR code on other failure Hi, If you look in the old libusb-0.1 code you'll see something different I think. Could you check that? --HPS From owner-freebsd-usb@FreeBSD.ORG Sat Dec 22 10:17:17 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E1F87DD2; Sat, 22 Dec 2012 10:17:17 +0000 (UTC) (envelope-from xiaofanc@gmail.com) Received: from mail-ee0-f45.google.com (mail-ee0-f45.google.com [74.125.83.45]) by mx1.freebsd.org (Postfix) with ESMTP id 4A7C58FC0A; Sat, 22 Dec 2012 10:17:16 +0000 (UTC) Received: by mail-ee0-f45.google.com with SMTP id d49so2782980eek.18 for ; Sat, 22 Dec 2012 02:17:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=gXJAEIJuFZ3LzKQQGm31Du4QbeQObjwE6dIfGL+AxNs=; b=lB1m8Cji0num6Bfyblq7yPfH4htFOvDkn8bBtym+Fkap0ImxHMpalXvX2JvXXfR9xm 1j0L8SYpsvN8GR+c75dZkO681FKfZVPoeelfHdtHrNhiEyRzHx+CAPk4hx4HTXMDWiZc k8AEur9SNemvhqsSDbdAfULx8v/HsCbckaOtUiRwEnpX7TP0Iwrrk958yfOBZbZzZY9n iro6AjJUL2dnTyzOMmK403gnlGzZ2XVxP/4J18QUy4tGbvix/jX5YWEP9HnGolSxVmh2 M/Jp3EYw7axCOVi39FKocninl2DjCNqbOI+ZwUoA0rJ4DBVJYVq9uI8P/C6aSGVG69ql 4waA== MIME-Version: 1.0 Received: by 10.14.207.6 with SMTP id m6mr39527227eeo.10.1356171435924; Sat, 22 Dec 2012 02:17:15 -0800 (PST) Received: by 10.223.90.204 with HTTP; Sat, 22 Dec 2012 02:17:15 -0800 (PST) In-Reply-To: <201212210838.32260.hselasky@c2i.net> References: <201211162247.qAGMlTm2057387@red.freebsd.org> <201211171319.34781.hselasky@c2i.net> <201212210838.32260.hselasky@c2i.net> Date: Sat, 22 Dec 2012 18:17:15 +0800 Message-ID: Subject: Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD From: Xiaofan Chen To: Hans Petter Selasky Content-Type: text/plain; charset=ISO-8859-1 Cc: "Wojciech A. Koszek" , freebsd-usb@freebsd.org X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 Dec 2012 10:17:18 -0000 On Fri, Dec 21, 2012 at 3:38 PM, Hans Petter Selasky wrote: > If you look in the old libusb-0.1 code you'll see something different I think. > Could you check that? Not much differences in reality. I believe it is a document bug for the libusb-0.1. Both old libusb-0.1 code and libusb-1.0 use the same IOCTL under Linux and the behavior should be similar. Please refer to the following code listing and take note even though the name of the IOCTL is different but they are the same if you look at the defines. On the other hand, libusb-win32's usb_reset will cause re-enumeration. >From libusb-0.1.12 source (linux.c) int usb_reset(usb_dev_handle *dev) { int ret; ret = ioctl(dev->fd, IOCTL_USB_RESET, NULL); if (ret) USB_ERROR_STR(-errno, "could not reset: %s", strerror(errno)); return 0; } >From libusb.org libusb.git (libusb-1.0) souce: static int op_reset_device(struct libusb_device_handle *handle) { int fd = _device_handle_priv(handle)->fd; int i, r, ret = 0; /* Doing a device reset will cause the usbfs driver to get unbound from any interfaces it is bound to. By voluntarily unbinding the usbfs driver ourself, we stop the kernel from rebinding the interface after reset (which would end up with the interface getting bound to the in kernel driver if any). */ for (i = 0; i < USB_MAXINTERFACES; i++) { if (handle->claimed_interfaces & (1L << i)) { op_release_interface(handle, i); } } usbi_mutex_lock(&handle->lock); r = ioctl(fd, IOCTL_USBFS_RESET, NULL); if (r) { if (errno == ENODEV) { ret = LIBUSB_ERROR_NOT_FOUND; goto out; } usbi_err(HANDLE_CTX(handle), "reset failed error %d errno %d", r, errno); ret = LIBUSB_ERROR_OTHER; goto out; } /* And re-claim any interfaces which were claimed before the reset */ for (i = 0; i < USB_MAXINTERFACES; i++) { if (handle->claimed_interfaces & (1L << i)) { r = op_claim_interface(handle, i); if (r) { usbi_warn(HANDLE_CTX(handle), "failed to re-claim interface %d after reset", i); handle->claimed_interfaces &= ~(1L << i); } } } out: usbi_mutex_unlock(&handle->lock); return ret; } -- Xiaofan From owner-freebsd-usb@FreeBSD.ORG Sat Dec 22 19:19:02 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 07CD53CB for ; Sat, 22 Dec 2012 19:19:02 +0000 (UTC) (envelope-from agapov.slava@gmail.com) Received: from mail-ob0-f169.google.com (mail-ob0-f169.google.com [209.85.214.169]) by mx1.freebsd.org (Postfix) with ESMTP id B69ED8FC0A for ; Sat, 22 Dec 2012 19:19:01 +0000 (UTC) Received: by mail-ob0-f169.google.com with SMTP id v19so5627656obq.28 for ; Sat, 22 Dec 2012 11:19:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=OCfwNQgA5fEsTuTdP7YYilOs6dh2+jiK3ZwbXIrdDbY=; b=ZHjwC/rIRo0b8nwu3HvL/9pj+zOZtM2QNOdNE/1tJ3wMJGE9PWaqzMdjRVZIhNHu1V EgHS/EJY3KcnValWnv884ptxVNFW7WdzJeji82noVTVQsceUaD52CCCHmHztVzjLqeAM FqqRGd/dQqKL6MH+PNW1ATGhLaj+Bj9hyDj6uWSS+ECZE2rmGCFtNpwZWlyGt6GpiWKb 9xqOjIjfIURtf4W/LmPYG1YQOsVIdeV0u+9x/IjY73Z/yC0sxRiCzFCHPVw2daCpE78l tLtwQZDNuCEKDbIo51exZ9ANa+OB1nFf3gokwLFzDtcrvDYOKZTPYWqyWC6lubFlwSsp nxFw== MIME-Version: 1.0 Received: by 10.60.30.201 with SMTP id u9mr2442392oeh.28.1356203940815; Sat, 22 Dec 2012 11:19:00 -0800 (PST) Received: by 10.182.112.193 with HTTP; Sat, 22 Dec 2012 11:19:00 -0800 (PST) Date: Sat, 22 Dec 2012 22:19:00 +0300 Message-ID: Subject: usb d-link dwa-125 From: =?KOI8-R?B?99HexdPMwdcg4cfB0M/X?= To: freebsd-usb@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 Dec 2012 19:19:02 -0000 Hello all. I use usb wi-fi d-link dwa-125 What I do: 1. insert usb 2. ugen2.2: at usbus2 3. usbconfig -d 2.2 dump_device_desc ugen2.2: <11n Adapter Ralink> at usbus5, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON bLength = 0x0012 bDescriptorType = 0x0001 bcdUSB = 0x0200 bDeviceClass = 0x0000 bDeviceSubClass = 0x0000 bDeviceProtocol = 0x0000 bMaxPacketSize0 = 0x0040 idVendor = 0x2001 [b] idProduct = 0x3c1e [/b] bcdDevice = 0x0101 iManufacturer = 0x0001 iProduct = 0x0002 <11n Adapter> iSerialNumber = 0x0003 <1.0> bNumConfigurations = 0x0001 4. in /usr/src/sys/dev/usb/usbdevs added product DLINK DWA125 0x3c1e DWA-125 in /usr/src/sys/dev/usb/usbdevs added RUN_DEV(DLINK, DWA125), and then cd /usr/src/sys/modules/usb/run make 5. load new kernel module kldload ./if_run.ko 6. dmesg run0: on usbus2 run0: MAC/BBP RT5390 (rev 0x0503), RF unknown (MIMO 1T1R), address bc:f6:85:f8:d1:90 7. ifconfig wlan0 create wlandev run0 wlanmode hostap ifconfig wlan0 create wlandev run0 wlanmode hostap 8. After this, my usb is crashed in dmesg wlan0: Ethernet address: bc:f6:85:f8:d1:90 run0: firmware RT3071 ver. 0.236 loaded wlan0: ieee80211_new_state_locked: pending INIT -> SCAN transition lost run0: at uhub2, port 4, addr 2 (disconnected) usbd_req_re_enumerate: addr=2, set address failed! (USB_ERR_STALLED, ignored) usbd_req_re_enumerate: addr=2, set address failed! (USB_ERR_STALLED, ignored) ugen2.2: at usbus2 (disconnected) Help me with this, please. From owner-freebsd-usb@FreeBSD.ORG Sat Dec 22 19:27:14 2012 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C0EA1502 for ; Sat, 22 Dec 2012 19:27:14 +0000 (UTC) (envelope-from agapov.slava@gmail.com) Received: from mail-ob0-f177.google.com (mail-ob0-f177.google.com [209.85.214.177]) by mx1.freebsd.org (Postfix) with ESMTP id 7D0088FC12 for ; Sat, 22 Dec 2012 19:27:14 +0000 (UTC) Received: by mail-ob0-f177.google.com with SMTP id uo13so5734012obb.36 for ; Sat, 22 Dec 2012 11:27:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=YGpgkk9AfBvZUGvbkOStuUXlJUFZifPFnfo0fNACCb4=; b=I8J63qsF8TjuwBWlj4M5zgGyeX3HFrPGH54o30GkpT8LMtPnKSMApAH0+QqCYzETrA 0Vo2St9WF7x7Qu6Se5inM32ei+e5pNwJ8YR2hCUHEfHb9S8DIgIBY4qUIm84LXPsPxMe +yw054GUUbx0Fl5m0hy4OtvZ5AcDBwcV6rg7LxEpsImGLwmx2aZmZyF2nUDig6JygHCn FNbP3GlrQr31u2zstufcjubMKfgykEreUhrpp0zY6jYxaUubk2CcfDWCJlZ7VAVbkvPz EGqGq9VWe+U8T1QzKUqTCahksh5dCe5APG5bfmZlZilo3s0SmpN3Ak1bzKoXK7JtCaTq TiZA== MIME-Version: 1.0 Received: by 10.182.52.100 with SMTP id s4mr13992625obo.70.1356204433865; Sat, 22 Dec 2012 11:27:13 -0800 (PST) Received: by 10.182.112.193 with HTTP; Sat, 22 Dec 2012 11:27:13 -0800 (PST) In-Reply-To: References: Date: Sat, 22 Dec 2012 22:27:13 +0300 Message-ID: Subject: Re: usb d-link dwa-125 From: =?KOI8-R?B?99HexdPMwdcg4cfB0M/X?= To: freebsd-usb@freebsd.org Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: quoted-printable X-Content-Filtered-By: Mailman/MimeDel 2.1.14 X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 Dec 2012 19:27:14 -0000 i forgot uname -a FreeBSD 10.0-CURRENT #0 r244586: 2012/12/22 =F7=D1=DE=C5=D3=CC=C1=D7 =E1=C7=C1=D0=CF=D7 > Hello all. > > I use usb wi-fi d-link dwa-125 > What I do: > 1. insert usb > 2. ugen2.2: at usbus2 > 3. usbconfig -d 2.2 dump_device_desc > ugen2.2: <11n Adapter Ralink> at usbus5, cfg=3D0 md=3DHOST spd=3DHIGH (48= 0Mbps) > pwr=3DON > > bLength =3D 0x0012 > bDescriptorType =3D 0x0001 > bcdUSB =3D 0x0200 > bDeviceClass =3D 0x0000 > bDeviceSubClass =3D 0x0000 > bDeviceProtocol =3D 0x0000 > bMaxPacketSize0 =3D 0x0040 > idVendor =3D 0x2001 > [b] idProduct =3D 0x3c1e [/b] > bcdDevice =3D 0x0101 > iManufacturer =3D 0x0001 > iProduct =3D 0x0002 <11n Adapter> > iSerialNumber =3D 0x0003 <1.0> > bNumConfigurations =3D 0x0001 > 4. > in /usr/src/sys/dev/usb/usbdevs added > product DLINK DWA125 0x3c1e DWA-125 > in /usr/src/sys/dev/usb/usbdevs added > RUN_DEV(DLINK, DWA125), > and then > cd /usr/src/sys/modules/usb/run > make > 5. load new kernel module > kldload ./if_run.ko > > 6. dmesg > run0: on usbus2 > run0: MAC/BBP RT5390 (rev 0x0503), RF unknown (MIMO 1T1R), address > bc:f6:85:f8:d1:90 > > 7. ifconfig wlan0 create wlandev run0 wlanmode hostap > ifconfig wlan0 create wlandev run0 wlanmode hostap > > 8. After this, my usb is crashed > in dmesg > wlan0: Ethernet address: bc:f6:85:f8:d1:90 > run0: firmware RT3071 ver. 0.236 loaded > wlan0: ieee80211_new_state_locked: pending INIT -> SCAN transition lost > run0: at uhub2, port 4, addr 2 (disconnected) > usbd_req_re_enumerate: addr=3D2, set address failed! (USB_ERR_STALLED, > ignored) > usbd_req_re_enumerate: addr=3D2, set address failed! (USB_ERR_STALLED, > ignored) > ugen2.2: at usbus2 (disconnected) > > Help me with this, please. > >