root_hub.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2011 Jan Vesely
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * - Redistributions of source code must retain the above copyright
00010  *   notice, this list of conditions and the following disclaimer.
00011  * - Redistributions in binary form must reproduce the above copyright
00012  *   notice, this list of conditions and the following disclaimer in the
00013  *   documentation and/or other materials provided with the distribution.
00014  * - The name of the author may not be used to endorse or promote products
00015  *   derived from this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00019  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00020  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
00022  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00023  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00024  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00026  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  */
00034 #include <errno.h>
00035 #include <str_error.h>
00036 #include <ddi.h>
00037 #include <usb/debug.h>
00038 
00039 #include "root_hub.h"
00040 
00049 int uhci_root_hub_init(
00050   uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh)
00051 {
00052         assert(instance);
00053         assert(rh);
00054 
00055         /* Allow access to root hub port registers */
00056         assert(sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT <= size);
00057         port_status_t *regs;
00058         int ret = pio_enable(addr, size, (void**)&regs);
00059         if (ret < 0) {
00060                 usb_log_error(
00061                     "Failed(%d) to gain access to port registers at %p: %s.\n",
00062                     ret, regs, str_error(ret));
00063                 return ret;
00064         }
00065 
00066         /* Initialize root hub ports */
00067         unsigned i = 0;
00068         for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) {
00069                 ret = uhci_port_init(
00070                     &instance->ports[i], &regs[i], i, ROOT_HUB_WAIT_USEC, rh);
00071                 if (ret != EOK) {
00072                         unsigned j = 0;
00073                         for (;j < i; ++j)
00074                                 uhci_port_fini(&instance->ports[j]);
00075                         return ret;
00076                 }
00077         }
00078 
00079         return EOK;
00080 }
00081 /*----------------------------------------------------------------------------*/
00086 void uhci_root_hub_fini(uhci_root_hub_t* instance)
00087 {
00088         assert(instance);
00089         unsigned i = 0;
00090         for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) {
00091                 uhci_port_fini(&instance->ports[i]);
00092         }
00093 }
00094 /*----------------------------------------------------------------------------*/

Generated on Thu Jun 2 07:45:44 2011 for HelenOS/USB by  doxygen 1.4.7