From owner-freebsd-stable Mon Mar 25 10:42:18 2002 Delivered-To: freebsd-stable@freebsd.org Received: from a.smtp-out.sonic.net (a.smtp-out.sonic.net [208.201.224.38]) by hub.freebsd.org (Postfix) with SMTP id 3306237B405 for ; Mon, 25 Mar 2002 10:41:35 -0800 (PST) Received: (qmail 28236 invoked from network); 25 Mar 2002 18:41:34 -0000 Received: from buzz.sonic.net (208.201.224.78) by a.smtp-out.sonic.net with SMTP; 25 Mar 2002 18:41:34 -0000 Received: from sonic.net (newbolt [208.201.242.18]) by buzz.sonic.net (8.11.6/8.8.5) with ESMTP id g2PIfYa18548 for ; Mon, 25 Mar 2002 10:41:34 -0800 Received: from newbolt.sonic.net (IDENT:darrylo@localhost [127.0.0.1]) by sonic.net (8.12.1/8.12.1) with ESMTP id g2PIfYAa023638 for ; Mon, 25 Mar 2002 10:41:34 -0800 Received: (from darrylo@localhost) by newbolt.sonic.net (8.12.1/8.12.1/Submit) id g2PIfXpF023637 for stable@freebsd.org; Mon, 25 Mar 2002 10:41:33 -0800 Received: from msgbas1.cos.agilent.com (msgbas1x.cos.agilent.com [192.25.240.36]) by turbo.sonic.net (8.11.6/8.8.5) with ESMTP id g2PIeoJ20851 for ; Mon, 25 Mar 2002 10:40:50 -0800 X-envelope-info: Received: from msgrel1.cos.agilent.com (msgrel1.cos.agilent.com [130.29.152.77]) by msgbas1.cos.agilent.com (Postfix) with ESMTP id 29E57AD65 for ; Mon, 25 Mar 2002 11:40:50 -0700 (MST) Received: from mina.soco.agilent.com (mina.soco.agilent.com [141.121.54.157]) by msgrel1.cos.agilent.com (Postfix) with ESMTP id D0B2DA52 for ; Mon, 25 Mar 2002 11:40:49 -0700 (MST) Received: from mina.soco.agilent.com (darrylo@localhost [127.0.0.1]) by mina.soco.agilent.com (8.9.3 (PHNE_22672)/8.9.3 SMKit7.1.1_Agilent) with ESMTP id KAA20774 for ; Mon, 25 Mar 2002 10:40:49 -0800 (PST) Message-Id: <200203251840.KAA20774@mina.soco.agilent.com> Subject: Foo To: darrylo@sonic.net Mime-Version: 1.0 (generated by tm-edit 1.7) Content-Type: text/plain Date: Mon, 25 Mar 2002 10:40:49 -0800 From: Darryl Okahata Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG To: stable@FreeBSD.ORG, usb-bsd@yahoogroups.com Subject: How to get USB hard disks working on FreeBSD-stable FYI, Here's a draft document that describes how to get USB hard disks working under FreeBSD-STABLE. It assumes basic sysadmin skills, as well as basic C programming proficiency. Note that this document is only needed until FreeBSD-STABLE gets fixed, and no longer needs the DA_Q_NO_6_BYTE hackery (for USB devices). -- Darryl Okahata darrylo@soco.agilent.com DISCLAIMER: this message is the author's personal opinion and does not constitute the support, opinion, or policy of Agilent Technologies, or of the little green men that have been following him all day. =============================================================================== USB Hard Disks and FreeBSD-STABLE Version 0.5, Mon Mar 25, 2002 (C) Copyright 2002, by Darryl Okahata (darrylo@sonic.net) IMPORTANT: THIS DOCUMENTATION IS PROVIDED BY DARRYL OKAHATA "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DARRYL OKAHATA BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***** Summary: This article describes my experiences on getting an USB hard disk working with FreeBSD-STABLE. Anyone also wanting to do this should have some minimal C programming experience, as some simple modifications to the kernel source code will probably be needed. ***** Introduction: For transporting files between home and work, I was looking for a portable hard disk solution -- one supported by both FreeBSD and Windows. I could have used a laptop, but a laptop tends to be big and bulky, and I wanted something smaller. Tape drives tend to be slow and have limited capacity, and I was apprehensive about the reliability of proprietary drive solutions like Iomega's Jaz drive and Castlewood System's Orb. I ended up getting an USB 2.0 hard disk enclosure for 2.5" drives. Why USB? Well, I considered IEEE 1394 drives, but there seems to be possible royalty issues with IEEE 1394 and open-source operating systems (i.e., it's unclear if it's possible to have a no-cost/free driver). Also, USB 1.1 ports are pretty ubiquitous; I wouldn't have to buy any adapter cards. Yes, USB 1.1 is slow, but it's not that slow, and, hopefully, FreeBSD will someday get USB 2.0 support. By getting an USB 2.0 hard disk enclosure, I can use it with USB 1.1 ports today (although a bit slowly), and I can hopefully continue to use it when FreeBSD gets USB 2.0 support. Also, by getting a standard 2.5" enclosure, I can use 2.5" (laptop) drives, which tend to be more rugged than 3.5" drives (and, possibly, more rugged than the proprietary drives, too). The price isn't bad, either; for around US$200, I can put together a 20GB USB 2.0 hard disk (~US$70 for the enclosure, ~$100-$110 for a 20GB drive, plus tax and shipping). It could be even much less, if I recycled an old, unused 2.5" laptop drive. ***** The Hardware: The most important piece of the puzzle is getting a good USB hard disk enclosure. Some older enclosures did not meet the USB mass storage specifications exactly, and required special drivers to be installed. Newer enclosures have better USB interface hardware, and often do not need any special drivers. Windows ME, 2000, and XP (but not 98SE and earlier) should have the standard USB mass storage drivers built into them, and do not need any special drivers to be installed. My idea was that, if the hardware was standard enough to not need any special Windows drivers, then the hardware "should" also work with FreeBSD. Fortunately, the hardware I bought did eventually work with FreeBSD, although I had to apply some kernel fixes. Unfortunately, for those of you who would also like to do what I did, I have no idea who makes the USB 2.0 enclosure; while the packaging box is of decent quality, with color pictures and printing, it does not list any manufacturer's name. I assume that this is some generic brand made in either Taiwan or China. The main labeling is ``Portable 2.5" HDD Enclosure'', and "ME-910 Series", and the particular model I have is, "ME-910U2", for "IDE to USB 2.0". The same manufacturer also apparently makes a model "ME-910U" (for "IDE to USB 1.1"), and a model "ME-910F" (for "IDE to IEEE 1394"). The second most important piece of hardware is a functional USB port. Fortunately, you probably already have one built into your PC's motherboard. Unfortunately, you may have buggy USB ports; I've heard that some older VIA-chipset-based motherboards have buggy USB ports. If you have one of these, you may be out-of-luck. You also need one supported by FreeBSD, although most are, if not all. ***** Getting It All Working: * First, decide if you're going to dedicate the entire USB disk to FreeBSD, or if you're going to use/share it with Windows. You've got three choices: 1. Use the entire disk for FreeBSD. Even though you're going to use the entire disk for FreeBSD, you should use Windows 2000/ME/XP to format the disk and put a small Windows volume on the disk; this will be used later as a test to see if you need to apply some kernel tweaks. If you don't have access to a Windows system, don't worry; you can just assume that you need to apply the tweaks. 2. Use the entire disk for Windows. If so, use Windows to format the disk, and let it use up all the disk space. If you're using WinNT or above, you'll probably want to format the disk as FAT32, as NTFS is not well supported by FreeBSD. 3. Partition the disk into two parts: one for FreeBSD, and one for Windows. If so, use Windows to format the disk (just like the previous step), but do not allocate the entire disk to Windows. Again, if you're using WinNT or above, you'll want to format the drive as FAT32 and not NTFS. * Disconnect the USB disk from your system, if it's currently connected. You want to leave the disk disconnected for now. * Next, you need to get and boot a recent version of FreeBSD-STABLE. If you don't know how, follow the directions in the handbook to do so. You also need to make sure that you have the kernel sources, as you'll probably have to edit the kernel sources and rebuild it. It has to be a recent FreeBSD-STABLE. Unfortunately, FreeBSD 4.5-RELEASE will probably not work. I was using FreeBSD-STABLE as of mid-February 2002 (released after 4.5-RELEASE), and the USB drivers in that version would not work; I would get errors like: umass0: BBB reset failed, TIMEOUT However, after noticing that a number of USB-related changes have been made, I upgraded to FreeBSD-STABLE (March 19, 2002 as of ~3AM PST, CVS tag: RELENG_4). After a bit of tweaking, I was eventually able to get the USB disk working. * Configure the kernel for USB devices. If you're using the standard, GENERIC, kernel, this has already been done for you, and you can skip this step. However, note that, in subsequent steps, you will still have to edit the kernel sources, rebuild the kernel, and reboot. At this point, we're only interested in getting enough functionality working to query the USB bus and USB hard disk, in order to get the necessary information that we'll later use to edit to the kernel sources. [ Note: the following is for people who have customized their kernels, and are not using the standard, GENERIC, kernel. It's assumed that they know how to configure and build a kernel. ] If you're using a nonstandard kernel, you need to have built a kernel with the following devices: # SCSI peripherals device scbus # SCSI bus (required) device da # Direct Access (disks) You also need to add the basic PCI-USB driver, depending on the hardware that you have; also add one of the following: device uhci # UHCI PCI->USB interface device ohci # OHCI PCI->USB interface It's generally easiest to just add both, though. You need additional USB device drivers, although these can be either built into the kernel, or loaded as kernel modules: device usb # USB Bus (required) device umass # Disks/Mass storage - Requires scbus and da * Enable the USB daemon (the next time you reboot) by adding the following line to /etc/rc.conf: usbd_enable="YES" * Reboot FreeBSD to make sure that USB support is enabled. If you're using the standard GENERIC kernel, you can skip this step. * Connect the USB disk to your system. In the syslog (and, usually, the console), messages similar to the following will appear, but they'll be somewhat different: umass0: DMI USB 2.0 Storage Adaptor, rev 2.00/10.07, addr 3 da0 at umass-sim0 bus 0 target 0 lun 0 da0: Fixed Direct Access SCSI-0 device da0: 650KB/s transfers da0: 19077MB (39070080 512 byte sectors: 64H 32S/T 19077C) Note the disk drive identification; in the above, it's: TOSHIBA MK2016GAP U0.3 Yours will probably be different. Make a note of the EXACT string. If you don't see messages like the above when you connect the disk, you're probably using a buggy version of FreeBSD. You probably need to upgrade. This is especially true if you see errors like: umass0: BBB reset failed, TIMEOUT * Hopefully, you have a windows partition on the disk (if you don't, assume that you need to apply the kernel tweaks, and skip to the next step). As a test (which will probably fail), try mounting it: mount_msdos /dev/da0s1 /mnt You may have to edit the above command before running it: + If you only added one Windows volume to the disk, the device name will be /dev/da0s1. If you have more than one Windows volume, the device name will be different, and you'll have to replace "/dev/da0s1" with the correct name. + You can use "/mnt" only if there isn't already something mounted there. If there is, use something else. Chances are, the above command will fail (assuming that you used the correct parameters), with messages like the following appearing in the syslog/console: (da0:umass-sim0:0:0:0): READ(06). CDB: 8 0 0 0 4 0 (da0:umass-sim0:0:0:0): ILLEGAL REQUEST asc:21,0 (da0:umass-sim0:0:0:0): Logical block address out of range If you see this, don't worry; it just means that you have to tweak the kernel sources. In the above, note that the failing command is, "READ(06)"; if you see anything else, stop now, as something else is going wrong, and the rest of these instructions will probably not help you. If, by some miracle, the above command actually succeeds, rejoice. It means that you do not have to tweak the kernel sources, and that the USB disk should already be fully functional under FreeBSD. You can skip the rest of these steps, and start using the disk normally (but see the cautions below on disconnecting the disk from the USB bus!). * If the above mount failed, it means that you probably need to apply some kernel tweaks. What's happening is that FreeBSD treats an IDE USB disk as a SCSI disk, and tries to send it 6-byte SCSI commands, but the USB disk probably understands only 10-byte SCSI commands, and gives errors when 6-byte commands are used. [ Yes, it may seem strange, treating an IDE USB disk as a SCSI one, but it's actually a pretty good idea. This simplifies driver writing, because the USB driver only has to worry about low-level details, and the higher-level SCSI driver can handle a lot of the upper-level details. ] Fortunately, FreeBSD allows you to mark certain SCSI devices as being incapable of understanding 6-byte SCSI commands, which is a passable workaround for this problem. Ideally, the driver should fall back to using 10-byte commands if 6-byte one fails, but this does not (yet?) exist in FreeBSD-STABLE (I believe it does exist in FreeBSD-CURRENT, though). This is where the drive identification string comes in (you did make a note of it, above, right?). Here's a tricky part: you have to break up this drive identification string into a manufacturer name, a model name, and a revision. Hopefully, you're familiar with disk drive manufacturers; if you're not, ask around. In the above example, the drive identification string is (and this will almost certainly be different for you): TOSHIBA MK2016GAP U0.3 Here, the manufacturer name is "TOSHIBA", and the model name is "MK2016GAP", and the revision is "U0.3". Note that this one's easy; other drive identification strings may have additional spaces. The two key parts you'll need are the manufacturer and model names. Make a note of them. * As root, go to /usr/src/sys/cam/scsi, and edit the file, "scsi_da.c". Search for the variable, "da_quirk_table"; you want to locate where it is defined. The variable, "da_quirk_table", contains a list of all SCSI devices that need to be specially handled, and it is here where we need to add an entry for our USB disk. Basically, to this variable, you want to add an entry like: { {T_DIRECT, SIP_MEDIA_FIXED, "TOSHIBA", "MK2016GAP", "*"}, /*quirks*/ DA_Q_NO_6_BYTE }, Replace "TOSHIBA" with the manufacturer name of your disk, and replace "MK2016GAP" with the model name. This will tell FreeBSD to specially handle your USB disk -- to not use 6-byte SCSI commands. Rebuild your kernel (don't forget to do a "make depend"), and reboot. The USB disk should be functional. >From here, you should be able to use the disk normally. However, before physically disconnecting the USB disk from the USB bus, do not forget to unmount any mounted filesystems that come off the USB disk. Bad Things Will Happen if you disconnect the disk before unmounting any such filesystems (you may lose data, or FreeBSD might crash). If part or all of the disk is going to be used for FreeBSD, just follow the instructions in the handbook. ***** Notes: * When using an USB disk, do not forget to unmount any filesystems that come off the USB disk. Bad Things Will Happen if you disconnect the disk before unmounting any such filesystems. You may lose data, or FreeBSD might crash. * For instructions on adding a disk to FreeBSD, see the chapter called, "Storage". --}-<> To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message