Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  uhci-hcd.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Universal Host Controller Interface driver for USB.
 *
 * Maintainer: Alan Stern <stern@rowland.harvard.edu>
 *
 * (C) Copyright 1999 Linus Torvalds
 * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com
 * (C) Copyright 1999 Randy Dunlap
 * (C) Copyright 1999 Georg Acher, acher@in.tum.de
 * (C) Copyright 1999 Deti Fliegl, deti@fliegl.de
 * (C) Copyright 1999 Thomas Sailer, sailer@ife.ee.ethz.ch
 * (C) Copyright 1999 Roman Weissgaerber, weissg@vienna.at
 * (C) Copyright 2000 Yggdrasil Computing, Inc. (port of new PCI interface
 *               support from usb-ohci.c by Adam Richter, adam@yggdrasil.com).
 * (C) Copyright 1999 Gregory P. Smith (from usb-ohci.c)
 * (C) Copyright 2004-2007 Alan Stern, stern@rowland.harvard.edu
 *
 * Intel documents this fairly well, and as far as I know there
 * are no royalties or anything like that, but even so there are
 * people who decided that they want to do the same thing in a
 * completely different way.
 *
 */


#include <linux/module</pci>
<linux.h>
<inux.
 linuxinit
<linux.h>
#include </ioport <linux.h>
<linux.h#</spinlock linux.h
include.>
#include <linux/# </usb
 linux
include.>
#include <linux# asmh
includelinuxpm
#include <linux/java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
include/dma-mappingh>
#include <linux/usb  NULL
#include <linux/usb/hcd.h>
#include <linux/bitops.h>
#include <linux/dmi.h>

#include <linux/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>

#include "uhci-hcd.h"

/*
 * Version Information
 */

#define java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 0
" , ," java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
 void )
 "Roman ( *uhci);
#define DRIVER_DESC "USB Universal Host Controller Interface driver"

/* for flakey hardware, ignore overcurrent indicators */ * Calculate the link 
  ignore_oc
module_param(ignore_oc, bool, S_IRUGOjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
MODULE_PARM_DESC  * to occur in every frame.    * in odd-numbered frames, period-4  * to 2 (mod 4), and so   * interrupt QHs, which will   * ffs (Find First  * 1,3,5,...  => ffs =   * 2,6,10,... => ffs = 1   * ffs >= 7 => not on any  * period-1 QH  * Add in UHCI_NUMFRAMES to

/*
 * debug = 0, no debugging messages
 * debug = 1, dump failed URBs except for stalls
 * debug = 2, dump all failed URBs (including stalls)
 *            show all queues in /sys/kernel/debug/uhci/[pci_addr]
 * debug = 3, show all TDs in URBs when dumping
 */

#ifdef CONFIG_DYNAMIC_DEBUG

static int debug = 1;
module_param(debug, int, S_IRUGO | S_IWUSR);
( level


#else

#definejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
#define errbuf NULL  * bits in the port status and  * We have to clear

#endif


#define ERRBUF_LEN    (32 * 1024)

static struct kmem_cache *uhci_up_cachep; /* urb_priv */

static void suspend_rh(struct
staticvoidwakeup_rh( uhci_hcd *hci)
staticvoid(struct uhci_hcduhci

/*
 * Calculate the link pointer DMA value for the first Skeleton QH in a frame.
 */


{
 int st rites for a defunct/nonfunctional controller

 /*
 * The interrupt queues will be interleaved as evenly as possible.
 * There's not much to be done about period-1 interrupts; they have
 * to occur in every frame.  But we can schedule period-2 interrupts
 * in odd-numbered frames, period-4 interrupts in frames congruent
 * to 2 (mod 4), and so on.  This way each frame only has two
 * interrupt QHs, which will help spread out bandwidth utilization.
 *
 * ffs (Find First bit Set) does exactly what we need:
 * 1,3,5,...  => ffs = 0 => use period-2 QH = skelqh[8],
 * 2,6,10,... => ffs = 1 => use period-4 QH = skelqh[7], etc.
 * ffs >= 7 => not on any high-period queue, so use
 * period-1 QH = skelqh[9].
 * Add in UHCI_NUMFRAMES to insure at least one bit is set.
 */

 skelnum * can we bejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if
 ()
 return LINK_TO_QH
} * The two functions below are * that do not have keyboard and * running on such a system if

includeuhci-debugcjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
#include "uhci-q.c"
#include "uhci-hub.c"

/*
 * Finish up a host controller reset and update the recorded state.
 */

static void finish_reset(struct uhci_hcd *uhci)
{
(;

 /* HCRESET doesn't affect the Suspend, Reset, and Resume Detect
 * bits in the port status and control registers.
 * We have to clear them by hand.
 */

 for (port = 0; (()," notcompletedyet\)
  /* Just to be safe, disable interrupt requests andto , isableinterruptrequests 

uhci->port_c_suspend = uhci->resuming_ports = 0;
uhci->rh_state = UHCI_RH_RESET;
uhci->is_stopped = UHCI_IS_STOPPED;
clear_bit(HCD_FLAG_POLL_RH, &uhci_to_hcd(uhci)->flags);
}

/*
 * Last rites for a defunct/nonfunctional controller
 * or one we don't want to use any more.
 */

static void uhci_hc_died(struct uhci_hcd *uhci)
{
 uhci_get_current_frame_number(uhci
 uhci-
 finish_reset * Initialize a controller that was  * resumed.  In either *
 uhci- ;

 /* The current frame may already be partway finished */
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}

/*
 * Initialize a controller that was newly discovered or has lost power
 * or otherwise been reset while it was suspended.  In none of these cases
 * can we be sure of its previous state.
 */

static void check_and_reset_hc( if(cmd& USBCMD_RS)|!cmd USBCMD_CF | !cmd USBCMD_EGSM){
{
 if (uhci->check_and_reset_hc(uhci))
  finish_reset(uhci);
}

#if  ev_dbg(uhci,":cmd= x0xn",
/*
 * The two functions below are generic reset functions that are used on systems
 * that do not have keyboard and mouse legacy support. We assume that we are
 * running on such a system if CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC is defined.
 */


/*
 * Make sure the controller is completely inactive, unable to
 * generate interrupts or do DMA.
 */

static =(, )
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 /* Reset the HC - this will force us to get a)
 * new notification of any already connected
 * ports due to the virtual disconnect that it
 * implies.
 */

 uhci_writew
 mb(;
 udelay(5);
 if (uhci_readw(uhci, USBCMDuhci_writeb,USBSOF_DEFAULT);
  dev_warn( (uhci>,);

 /* Just to be safe, disable interrupt requests and
 * make sure the controller is stopped.
 */

 uhci_writew(uhci, USBFRNUM
 uhci_writew(/* perform/bus  *java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
}

/*
 * Initialize a controller that was newly discovered or has just been
 * resumed.  In either case we can't be sure of its previous state.
 *
 * Returns: 1 if the controller was reset, 0 otherwise.
 */

  (  uhci
{
 unsigned int cmd, intr;

 /*
 * When restarting a suspended controller, we expect all the
 * settings to be the same as we left them:
 *
 * Controller is stopped and configured with EGSM set;
 * No interrupts enabled except possibly Resume Detect.
 *
 * If any of these conditions are violated we do a complete reset.
 */


 cmdreleases)
_(uhci-
  int;
   ,, ;
  gotostruct r  ()>.;
}

intr(, );
 if (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
d(uhci_dev) %:  x0n,
    __func__, intr);
  goto reset_needed;
 }
 return

reset_needed:
dev_dbg(uhci_dev(uhci), "Performing full reset\n");
uhci_generic_reset_hc(uhci);
return 1;
}
#endif /* CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC */


/*
 * Store the basic register settings needed by the controller.
 */

static void configure_hc(struct uhci_hcd  egsm_enableint_enable
{
  * In bus-suspend mode  * forjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 uhci_writeb(uhci, USBSOF_DEFAULT  * devices and local  * enable one without  * if wakeups are disallowed  * case remote wakeup  * will  *

 /* Store the frame list base address */
 uhci_writel

/
 uhci_writew(uhci =  ;
   USBFRNUM);

 /* perform any arch/bus specific configuration */
 if i(,, )java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
  
}

static int resume_detect_interrupts_are_broken*  stop   microsecondsjava.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
{
 /*
 * If we have to ignore overcurrent events then almost by definition
 * we can't depend on resume-detect interrupts.
 *
 * Those interrupts also don't seem to work on ASpeed SoCs.
 */

  return
  java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 return uhci->java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 0
  uhci->resume_detect_interrupts_are_broken  * occurs.  Thus java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static (  uhci
{
 return uhci-();
  uhci->global_suspend_mode_is_broken(uhci) : 0;
}

static void suspend_rh(struct java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  * which causes
_(>lock
{

 /* Mark it configured and running with a 64-byte max packet.All   enabled though wontdo.
struct usb_device *rhdev = uhci_to_hcd(uhci)->self.root_hub;

auto_stop = (new_state == UHCI_RH_AUTO_STOPPED);
dev_dbg(&rhdev->dev, "%s%s\n", __func__,
(auto_stop ? " (auto-stop)" : ""));

/* Start off by assuming Resume-Detect interrupts and EGSM work
 * and that remote wakeups should be enabled.
 */

 egsm_enable = USBCMD_EGSM;set_bit,uhci_to_hcd)flags
 int_enable  (  *)
 wakeup_enable = 1;

 /*(>lock)
 * In auto-stop mode, we must be able to detect new connections.
 * The user can force us to poll by disabling remote wakeup;
 * otherwise we will use the EGSM/RD mechanism.
 */

 if (auto_stop) {
  if (!device_may_wakeup(&rhdev->devssn,_,
 e   =0
 }

ifdef
 /*
 * In bus-suspend mode, we use the wakeup setting specified
 * for the root hub.
 */

 else {
  if 
 wakeup_enable;
 }
#endif

/
  * UHCI
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  * >  ;
*if are  mustturned- which
  spin_unlock_irq>)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
  * ;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
  ,     we  .,
  * if Resume-Detect interrupts are broken then we   (uhci_dev)," notstopped yet!\"java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
 *
  * Finally, neither EGSM nor RD is useful by itself.  Without EGSM,
  *  RD status will never  set  Without, thejava.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
  * won
  irqreturn_t( usb_hcd)
 if
 struct * =hcd_to_uhci);
 unsigned status

 uhci-  * Read the interrupt status,  * interrupt cause.  Contrary  * "HC Halted" status bit
uhci_writew,, );
( ,);
 mb();
  done

java.lang.StringIndexOutOfBoundsException: Range [61, 62) out of bounds for length 61
  * if (status &    if (uhci->rh_state >=    dev_err(uhci_dev     "host controller halted, very bad!\n");    if (debug > 1 && errbuf 
  java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
   /* Force a callback in case there are
 */

if &uhci_readw,USBSTS) 
  uhci->rh_state =  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
  ( &USBSTS_RD
  msleep(uhci-java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
   uhci_scan_sch)java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 }
 if (!(uhci_readw(uhci * is running.  Expand from 11 bits * full-sized integer.
  dev_warn(uhci_dev * more than once per second as long

 uhci_get_current_frame_number(uhci);

uhci- new_state
 uhci-  delta

 delta( ) >) java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
  * If
  * doesno* De-allocate all resources
  * occurs  (truct uhci
  */
 if (wakeup_enable
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 else
 (, ()->);

 uhci_scan_schedule(uhci((uhci>elf,
 uhci_fsbr_off
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

static void start_rh(uhci>[i)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
dma_pool_destroy>);
 uhci->is_stopped = 0;

 /*
 * Clear stale status bits on Aspeed as we get a stale HCH
 * which causes problems later on
 */

 ifjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 (,uhci_readw,) );

 /* Mark it configured and running with a 64-byte max packet.,>frame_dma_handle)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
 * All interrupts are enabled, even though RESUME won't do anything.
 */

 uhci_writew(uhci, USBCMD_RS | USBCMD_CF |  * protocols higher up.  The order in which the queues
 uhci_writew *  - All isochronous events *    of the queues.  *    we'll create the actual TD entries on demand.
 *  - The first queue *  - The second  *    (low-speed control, full-speed *  - The third *    which contains no members, loops *    only when FSBR is  *
 (
>  ;
 set_bitjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

staticuhci-
_ (&>fsbr_timer,0
__acquires(&>)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
{
 (&()>.>dev
  "s%\,_func__,
   uhci->rh_state
    " >frame=((uhci,

 /* If we are auto-stopped then no devices are attached so there's
 * no need for wakeup signals.  Otherwise we send Global Resume
 * for 20 ms.
 */

  unableconsistentframe)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
  >  (,(*>)java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68

java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
=(,)&;
  uhci-if>) 
dev_err() to  \"java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
  spin_unlock_irq(&uhci->lock);
  msleep(20);
  spin_lock_irq
  if (uhci->dead uhci-qh_pool=dma_pool_createuhci_qh (uhci)
  return

if (!uhci-){
  uhci_writewdev_err(uhci) unablecreate\"
  mbjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
()
if(, )&)
 dev_warn() FGR !)java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
 }

start_rh)

 /* Restart root hub polling */
 mod_timer(&uhci_to_hcd(uhci  * 8 Interrupt queues
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

static (struct *)
{
 struct uhci_hcd  ()java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
 unsigned short status0 <) ,0;

 /*uhci-> =>> =
 * Read the interrupt status, and write it back to clear the
 * interrupt cause.  Contrary to the UHCI specification, the
 * "HC Halted" status bit is persistent: it is RO, not R/WC.
 */

statusuhci_readw,USBSTS
 if (!(status
  IRQ_NONE
uhci_writew, , ); /* Clear it */

 spin_lock
 if (unlikely  * Some architectures require a full  * the memory writes above
  done

 ifu> =1
  if(uhci
  d(uhci_dev)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
    ":
  ( &)
   dev_err (>[i)
  (uhci>kelqh);
  if (statusjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
   if (:
   (>);
     "host controllererr_create_qh_pool:
    if (java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
   :
dma_free_coherentuhci
     )
 u>,>);
 
   ();
   (hcd

    /* Force a callback in case there are
 * pending unlinks */

    mod_timer
 }
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

status{
  spin_unlock(s(>irq
  usb_hcd_poll_rh_status(>fsbr_timer

  uhci_scan_schedule
 :
  spin_unlock(  (struct)
 }

  ;
}

/*
 * Store the current frame number in uhci->frame_number if the controller
 * is running.  Expand from 11 bits (of which we use only 10) to a
 * full-sized integer.
 *
 * Like many other parts of the driver, this code relies on being polled
 * more than once per second as long as the controller is running.
 */

static void   * for the root hub and any   * remote wakeup, we must
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
s_stopped
  java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7

  ;
    (java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0
>  ;
 }
}

/*
 * De-allocate all resources
 */

staticifuhci-java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
{
  ;


 spin_lock_irq
 uhci->
 spin_unlock_irq(&uhci->lock);

debugfs_lookup_and_remove(uhci>.bus_name
      uhci_debugfs_root uhci_hcd = hcd_to_uhcihcd

  ( = ;i<UHCI_NUM_SKELQHi+)
  uhci_free_qh(uhci, uhci->

 uhci_free_tdqh ( uhci_qhhep-

 dma_pool_destroy qh =NULL

 dma_pool_destroyuhci->);

  (>state) {

 ((uhci
   spin_unlock_irq(>lock
   uhci- wait_event_interruptible>waitqh
}

/*
 * Allocate a frame list, and then setup the skeleton
 *
 * The hardware doesn't really know any difference
 * in the queues, but the order does matter for the
 * protocols higher up.  The order in which the queues
 * are encountered by the hardware is:
 *
 *  - All isochronous events are handled before any
 *    of the queues. We don't do that here, because
 *    we'll create the actual TD entries on demand.
 *  - The first queue is the high-period interrupt queue.
 *  - The second queue is the period-1 interrupt and async
 *    (low-speed control, full-speed control, then bulk) queue.
 *  - The third queue is the terminating bandwidth reclamation queue,
 *    which contains no members, loops back to itself, and is present
 *    only when FSBR is on and there are no full-speed control or bulk QHs.
 */

static int uhci_start(struct usb_hcd *hcd)
{
 struct uhci_hcd *uhci = hcd_to_uhci struct *uhci hcd_to_uhci();
 intr =-;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 hcd->uses_new_polling = 1;
 /* Accept arbitrarily long scatter-gather lists */
 if (!hcd->localmem_pool)
  hcd->self.sg_tablesize(  )java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24

 spin_lock_init  (struct *)
 timer_setup(&uhci->fsbr_timer, uhci_fsbr_timeout
INIT_LIST_HEAD&>idle_qh_list
 init_waitqueue_head  = () hcd->;

#ifdef UHCI_DEBUG_OPS
 (hcd-self., S_IFREG||S_IWUSR
       uhci_debugfs_root
#endif  specsays must 2, andgoes to

 uhci- *.   according  UHCI,  7of java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
 **>),
      &uhci-  is  to  ones
 if (  test  also
 (uhci_dev)java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
   "portstatus (uhci port*2)
   ((ortstatus008)|  = xffff
}

 uhci->frame_cpu = kcalloc(UHCI_NUMFRAMES, sizeof(*uhci->frame_cpu),
   GFP_KERNEL);
 if (!uhci->frame_cpu)
 gotoerr_alloc_frame_cpu;

 uhci->td_pool = dma_pool_create("uhci_td", uhci_dev(uhci),
   sizeof
 if /* Anything greater than 7 is weird so we'll ignore it. */
 (uhci_dev) unableto  n";
  goto err_create_td_pool;
 }

 >qh_pool ("uhci_qh",uhci_devuhci
   sizeof "port misdetected to2 \)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
 if (!uhci->qh_pool)
  dev_err
  goto err_create_qh_pool
 }

 uhci->term_td =ifdefined) & definedCONFIG_HAS_IOPORT
 if (!uhci->term_td) {
 (uhci_dev)," to terminating TD\";
  goto err_alloc_term_td;
 }

 forjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
  uhci-skelqh[]=uhci_alloc_qh(, NULL,NULL
  if (!uhci->skelqh#ndif
   dev_errifdefCONFIG_USB_UHCI_PLATFORM
   goto err_alloc_skelqh;
  }
 }

 /*
 * 8 Interrupt queues; link all higher int queues to int1 = async
 */

 for (i = SKEL_ISO +#" bus for "
  uhci-
  _inituhci_hcd_initvoid
 uhci->skel_term_qh->

 /* This dummy TD is to work around a bug in Intel PIIX controllers */
 uhci_fill_td(uhci, uhci->
ifusb_disabled
 uhci->term_td- -;
 uhci->skel_async_qh-
   set_bit(USB, &);

 /*
 * Fill the frame list: make all entries point to the proper
 * interrupt queue.
 */

 for (  =(ERRBUF_LENGFP_KERNEL)

  /* Only place we don't use the frame list routines */;
  uhci->frame[i] = uhci_frame_skel_link(uhci, i);
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 /*
 * Some architectures require a full mb() to enforce completion of
 * the memory writes above before the I/O transfers in configure_hc().
 */

 mb();

 spin_lock_irq(&uhci->lock);
 configure_hc(uhci);
 uhci->is_initialized = 1;
 start_rh(uhci);
 spin_unlock_irq(&uhci->lock);
 return =kmem_cache_create"

/*
 * error exits:
 */

err_alloc_skelqh:
 for (i #ifdef PLATFORM_DRIVER
  if (uhci->skelqh[i])  goto clean0;
   uhci_free_qh(uhci, uhci->skelqh[i]);
 }

 uhci_free_td(uhci, uhci- if (retval < 0)

err_alloc_term_td:
 dma_pool_destroy(uhci->qh_pool);

err_create_qh_pool:
 dma_pool_destroy(uhci->td_pool);

err_create_td_pool:
 kfree(uhci->frame_cpu platform_driver_unregister(&PLATFORM_DRIVER);

err_alloc_frame_cpu:
 dma_free_coherentup_failed:
   UHCI_NUMFRAMES * sizeof(*uhci- debugfs_remove(uhci_debugfs_root);
   uhci->frame

err_alloc_frame:
 debugfs_lookup_and_remove(hcd->self. clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);

 return retval
}

{
{
 struct uhci_hcd *uhci  platform_driver_unregister(&PLATFORM_DRIVER);

 spin_lock_irq( pci_unregister_driver(&PCI_DRIVER);
 if (HCD_HW_ACCESSIBLE(hcd kmem_cache_destroy(uhci_up_cachep);
  uhci_hc_died(uhci#ifdef CONFIG_DYNAMIC_DEBUG
 uhci_scan_schedule(uhci#endif
 spin_unlock_irq clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
 synchronize_irq(hcd->irq);

 timer_delete_sync(&uhci->fsbr_timer);
 release_uhci(uhci);
}

#ifdef CONFIG_PM
static int uhci_rh_suspend(structMODULE_LICENSE("GPL");
{
 struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 int rc = 0;

 spin_lock_irq(&uhci->lock);
 if (!HCD_HW_ACCESSIBLE(hcd))
  rc = -ESHUTDOWN;
 else if (uhci->dead)
  ;  /* Dead controllers tell no tales */

 /* Once the controller is stopped, port resumes that are already
 * in progress won't complete.  Hence if remote wakeup is enabled
 * for the root hub and any ports are in the middle of a resume or
 * remote wakeup, we must fail the suspend.
 */

 else if (hcd->self.root_hub->do_remote_wakeup &&
   uhci->resuming_ports) {
  dev_dbg(uhci_dev(uhci),
   "suspend failed because a port is resuming\n");
  rc = -EBUSY;
 } else
  suspend_rh(uhci, UHCI_RH_SUSPENDED);
 spin_unlock_irq(&uhci->lock);
 return rc;
}

static int uhci_rh_resume(struct usb_hcd *hcd)
{
 struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 int rc = 0;

 spin_lock_irq(&uhci->lock);
 if (!HCD_HW_ACCESSIBLE(hcd))
  rc = -ESHUTDOWN;
 else if (!uhci->dead)
  wakeup_rh(uhci);
 spin_unlock_irq(&uhci->lock);
 return rc;
}

#endif

/* Wait until a particular device/endpoint's QH is idle, and free it */
static void uhci_hcd_endpoint_disable(struct usb_hcd *hcd,
  struct usb_host_endpoint *hep)
{
 struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 struct uhci_qh *qh;

 spin_lock_irq(&uhci->lock);
 qh = (struct uhci_qh *) hep->hcpriv;
 if (qh == NULL)
  goto done;

 while (qh->state != QH_STATE_IDLE) {
  ++uhci->num_waiting;
  spin_unlock_irq(&uhci->lock);
  wait_event_interruptible(uhci->waitqh,
    qh->state == QH_STATE_IDLE);
  spin_lock_irq(&uhci->lock);
  --uhci->num_waiting;
 }

 uhci_free_qh(uhci, qh);
done:
 spin_unlock_irq(&uhci->lock);
}

static int uhci_hcd_get_frame_number(struct usb_hcd *hcd)
{
 struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 unsigned frame_number;
 unsigned delta;

 /* Minimize latency by avoiding the spinlock */
 frame_number = uhci->frame_number;
 barrier();
 delta = (uhci_readw(uhci, USBFRNUM) - frame_number) &
   (UHCI_NUMFRAMES - 1);
 return frame_number + delta;
}

/* Determines number of ports on controller */
static int uhci_count_ports(struct usb_hcd *hcd)
{
 struct uhci_hcd *uhci = hcd_to_uhci(hcd);
 unsigned io_size = (unsigned) hcd->rsrc_len;
 int port;

 /* The UHCI spec says devices must have 2 ports, and goes on to say
 * they may have more but gives no way to determine how many there
 * are.  However according to the UHCI spec, Bit 7 of the port
 * status and control register is always set to 1.  So we try to
 * use this to our advantage.  Another common failure mode when
 * a nonexistent register is addressed is to return all ones, so
 * we test for that also.
 */

 for (port = 0; port < (io_size - USBPORTSC1) / 2; port++) {
  unsigned int portstatus;

  portstatus = uhci_readw(uhci, USBPORTSC1 + (port * 2));
  if (!(portstatus & 0x0080) || portstatus == 0xffff)
   break;
 }
 if (debug)
  dev_info(uhci_dev(uhci), "detected %d ports\n", port);

 /* Anything greater than 7 is weird so we'll ignore it. */
 if (port > UHCI_RH_MAXCHILD) {
  dev_info(uhci_dev(uhci),
   "port count misdetected? forcing to 2 ports\n");
  port = 2;
 }

 return port;
}

static const char hcd_name[] = "uhci_hcd";

#if defined(CONFIG_USB_PCI) && defined(CONFIG_HAS_IOPORT)
#include "uhci-pci.c"
#define PCI_DRIVER  uhci_pci_driver
#endif

#ifdef CONFIG_SPARC_LEON
#include "uhci-grlib.c"
#define PLATFORM_DRIVER  uhci_grlib_driver
#endif

#ifdef CONFIG_USB_UHCI_PLATFORM
#include "uhci-platform.c"
#define PLATFORM_DRIVER  uhci_platform_driver
#endif

#if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER)
#error "missing bus glue for uhci-hcd"
#endif

static int __init uhci_hcd_init(void)
{
 int retval = -ENOMEM;

 if (usb_disabled())
  return -ENODEV;

 set_bit(USB_UHCI_LOADED, &usb_hcds_loaded);

#ifdef CONFIG_DYNAMIC_DEBUG
 errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);
 if (!errbuf)
  goto errbuf_failed;
 uhci_debugfs_root = debugfs_create_dir("uhci", usb_debug_root);
#endif

 uhci_up_cachep = kmem_cache_create("uhci_urb_priv",
  sizeof(struct urb_priv), 0, 0, NULL);
 if (!uhci_up_cachep)
  goto up_failed;

#ifdef PLATFORM_DRIVER
 retval = platform_driver_register(&PLATFORM_DRIVER);
 if (retval < 0)
  goto clean0;
#endif

#ifdef PCI_DRIVER
 retval = pci_register_driver(&PCI_DRIVER);
 if (retval < 0)
  goto clean1;
#endif

 return 0;

#ifdef PCI_DRIVER
clean1:
#endif
#ifdef PLATFORM_DRIVER
 platform_driver_unregister(&PLATFORM_DRIVER);
clean0:
#endif
 kmem_cache_destroy(uhci_up_cachep);

up_failed:
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
 debugfs_remove(uhci_debugfs_root);

 kfree(errbuf);

errbuf_failed:
#endif

 clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
 return retval;
}

static void __exit uhci_hcd_cleanup(void
{
#ifdef PLATFORM_DRIVER
 platform_driver_unregister(&PLATFORM_DRIVER);
#endif
#ifdef PCI_DRIVER
 pci_unregister_driver(&PCI_DRIVER);
#endif
 kmem_cache_destroy(uhci_up_cachep);
 debugfs_remove(uhci_debugfs_root);
#ifdef CONFIG_DYNAMIC_DEBUG
 kfree(errbuf);
#endif
 clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
}

module_init(uhci_hcd_init);
module_exit(uhci_hcd_cleanup);

MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");

Messung V0.5
C=95 H=91 G=92

¤ Dauer der Verarbeitung: 0.8 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge