Home | History | Annotate | Line # | Download | only in ic
      1  1.112    andvar /*	$NetBSD: sl811hs.c,v 1.112 2022/05/03 20:52:32 andvar Exp $	*/
      2    1.1     isaki 
      3    1.1     isaki /*
      4   1.12  kiyohara  * Not (c) 2007 Matthew Orgass
      5   1.36     skrll  * This file is public domain, meaning anyone can make any use of part or all
      6   1.36     skrll  * of this file including copying into other works without credit.  Any use,
      7   1.36     skrll  * modified or not, is solely the responsibility of the user.  If this file is
      8   1.36     skrll  * part of a collection then use in the collection is governed by the terms of
      9   1.12  kiyohara  * the collection.
     10   1.12  kiyohara  */
     11   1.12  kiyohara 
     12   1.12  kiyohara /*
     13   1.12  kiyohara  * Cypress/ScanLogic SL811HS/T USB Host Controller
     14   1.12  kiyohara  * Datasheet, Errata, and App Note available at www.cypress.com
     15   1.12  kiyohara  *
     16   1.36     skrll  * Uses: Ratoc CFU1U PCMCIA USB Host Controller, Nereid X68k USB HC, ISA
     17   1.12  kiyohara  * HCs.  The Ratoc CFU2 uses a different chip.
     18    1.1     isaki  *
     19   1.36     skrll  * This chip puts the serial in USB.  It implements USB by means of an eight
     20   1.36     skrll  * bit I/O interface.  It can be used for ISA, PCMCIA/CF, parallel port,
     21   1.36     skrll  * serial port, or any eight bit interface.  It has 256 bytes of memory, the
     22   1.36     skrll  * first 16 of which are used for register access.  There are two sets of
     23   1.36     skrll  * registers for sending individual bus transactions.  Because USB is polled,
     24   1.36     skrll  * this organization means that some amount of card access must often be made
     25   1.36     skrll  * when devices are attached, even if when they are not directly being used.
     26   1.36     skrll  * A per-ms frame interrupt is necessary and many devices will poll with a
     27   1.12  kiyohara  * per-frame bulk transfer.
     28    1.1     isaki  *
     29   1.36     skrll  * It is possible to write a little over two bytes to the chip (auto
     30   1.36     skrll  * incremented) per full speed byte time on the USB.  Unfortunately,
     31   1.36     skrll  * auto-increment does not work reliably so write and bus speed is
     32   1.12  kiyohara  * approximately the same for full speed devices.
     33   1.12  kiyohara  *
     34   1.36     skrll  * In addition to the 240 byte packet size limit for isochronous transfers,
     35   1.36     skrll  * this chip has no means of determining the current frame number other than
     36   1.36     skrll  * getting all 1ms SOF interrupts, which is not always possible even on a fast
     37   1.36     skrll  * system.  Isochronous transfers guarantee that transfers will never be
     38   1.36     skrll  * retried in a later frame, so this can cause problems with devices beyond
     39   1.36     skrll  * the difficulty in actually performing the transfer most frames.  I tried
     40   1.36     skrll  * implementing isoc transfers and was able to play CD-derrived audio via an
     41   1.12  kiyohara  * iMic on a 2GHz PC, however it would still be interrupted at times and
     42   1.36     skrll  * once interrupted, would stay out of sync.  All isoc support has been
     43   1.12  kiyohara  * removed.
     44   1.12  kiyohara  *
     45   1.36     skrll  * BUGS: all chip revisions have problems with low speed devices through hubs.
     46   1.36     skrll  * The chip stops generating SOF with hubs that send SE0 during SOF.  See
     47   1.36     skrll  * comment in dointr().  All performance enhancing features of this chip seem
     48   1.12  kiyohara  * not to work properly, most confirmed buggy in errata doc.
     49    1.1     isaki  *
     50    1.1     isaki  */
     51    1.1     isaki 
     52    1.1     isaki /*
     53   1.36     skrll  * The hard interrupt is the main entry point.  Start, callbacks, and repeat
     54   1.12  kiyohara  * are the only others called frequently.
     55   1.12  kiyohara  *
     56   1.36     skrll  * Since this driver attaches to pcmcia, card removal at any point should be
     57   1.12  kiyohara  * expected and not cause panics or infinite loops.
     58    1.1     isaki  */
     59   1.12  kiyohara 
     60   1.34     skrll /*
     61   1.34     skrll  * XXX TODO:
     62  1.112    andvar  *   copy next output packet while transferring
     63   1.12  kiyohara  *   usb suspend
     64   1.12  kiyohara  *   could keep track of known values of all buffer space?
     65   1.12  kiyohara  *   combined print/log function for errors
     66   1.12  kiyohara  *
     67   1.48     skrll  *   ub_usepolling support is untested and may not work
     68    1.1     isaki  */
     69    1.1     isaki 
     70    1.1     isaki #include <sys/cdefs.h>
     71  1.112    andvar __KERNEL_RCSID(0, "$NetBSD: sl811hs.c,v 1.112 2022/05/03 20:52:32 andvar Exp $");
     72   1.26     isaki 
     73   1.77     skrll #ifdef _KERNEL_OPT
     74   1.26     isaki #include "opt_slhci.h"
     75   1.56     skrll #include "opt_usb.h"
     76   1.56     skrll #endif
     77   1.56     skrll 
     78    1.1     isaki #include <sys/param.h>
     79   1.56     skrll 
     80   1.53     skrll #include <sys/bus.h>
     81   1.53     skrll #include <sys/cpu.h>
     82   1.53     skrll #include <sys/device.h>
     83   1.53     skrll #include <sys/gcq.h>
     84   1.53     skrll #include <sys/intr.h>
     85    1.1     isaki #include <sys/kernel.h>
     86   1.53     skrll #include <sys/kmem.h>
     87    1.1     isaki #include <sys/proc.h>
     88   1.12  kiyohara #include <sys/queue.h>
     89   1.56     skrll #include <sys/sysctl.h>
     90   1.53     skrll #include <sys/systm.h>
     91    1.1     isaki 
     92    1.1     isaki #include <dev/usb/usb.h>
     93    1.1     isaki #include <dev/usb/usbdi.h>
     94    1.1     isaki #include <dev/usb/usbdivar.h>
     95   1.56     skrll #include <dev/usb/usbhist.h>
     96    1.1     isaki #include <dev/usb/usb_mem.h>
     97    1.1     isaki #include <dev/usb/usbdevs.h>
     98   1.48     skrll #include <dev/usb/usbroothub.h>
     99    1.1     isaki 
    100    1.1     isaki #include <dev/ic/sl811hsreg.h>
    101    1.1     isaki #include <dev/ic/sl811hsvar.h>
    102    1.1     isaki 
    103   1.12  kiyohara #define Q_CB 0				/* Control/Bulk */
    104   1.12  kiyohara #define Q_NEXT_CB 1
    105   1.12  kiyohara #define Q_MAX_XFER Q_CB
    106   1.12  kiyohara #define Q_CALLBACKS 2
    107   1.12  kiyohara #define Q_MAX Q_CALLBACKS
    108   1.12  kiyohara 
    109   1.12  kiyohara #define F_AREADY		(0x00000001)
    110   1.12  kiyohara #define F_BREADY		(0x00000002)
    111   1.12  kiyohara #define F_AINPROG		(0x00000004)
    112   1.12  kiyohara #define F_BINPROG		(0x00000008)
    113   1.12  kiyohara #define F_LOWSPEED		(0x00000010)
    114   1.12  kiyohara #define F_UDISABLED		(0x00000020) /* Consider disabled for USB */
    115   1.12  kiyohara #define F_NODEV			(0x00000040)
    116   1.12  kiyohara #define F_ROOTINTR		(0x00000080)
    117   1.12  kiyohara #define F_REALPOWER		(0x00000100) /* Actual power state */
    118   1.12  kiyohara #define F_POWER			(0x00000200) /* USB reported power state */
    119   1.12  kiyohara #define F_ACTIVE		(0x00000400)
    120   1.12  kiyohara #define F_CALLBACK		(0x00000800) /* Callback scheduled */
    121   1.12  kiyohara #define F_SOFCHECK1		(0x00001000)
    122   1.12  kiyohara #define F_SOFCHECK2		(0x00002000)
    123   1.12  kiyohara #define F_CRESET		(0x00004000) /* Reset done not reported */
    124   1.12  kiyohara #define F_CCONNECT		(0x00008000) /* Connect change not reported */
    125   1.12  kiyohara #define F_RESET			(0x00010000)
    126   1.12  kiyohara #define F_ISOC_WARNED		(0x00020000)
    127   1.12  kiyohara #define F_LSVH_WARNED		(0x00040000)
    128   1.12  kiyohara 
    129   1.12  kiyohara #define F_DISABLED		(F_NODEV|F_UDISABLED)
    130   1.12  kiyohara #define F_CHANGE		(F_CRESET|F_CCONNECT)
    131   1.12  kiyohara 
    132   1.12  kiyohara #ifdef SLHCI_TRY_LSVH
    133   1.12  kiyohara unsigned int slhci_try_lsvh = 1;
    134   1.12  kiyohara #else
    135   1.12  kiyohara unsigned int slhci_try_lsvh = 0;
    136   1.12  kiyohara #endif
    137   1.12  kiyohara 
    138   1.12  kiyohara #define ADR 0
    139   1.12  kiyohara #define LEN 1
    140   1.12  kiyohara #define PID 2
    141   1.12  kiyohara #define DEV 3
    142   1.12  kiyohara #define STAT 2
    143   1.12  kiyohara #define CONT 3
    144   1.12  kiyohara 
    145   1.12  kiyohara #define A 0
    146   1.12  kiyohara #define B 1
    147   1.12  kiyohara 
    148   1.36     skrll static const uint8_t slhci_tregs[2][4] =
    149   1.12  kiyohara {{SL11_E0ADDR, SL11_E0LEN, SL11_E0PID, SL11_E0DEV },
    150   1.12  kiyohara  {SL11_E1ADDR, SL11_E1LEN, SL11_E1PID, SL11_E1DEV }};
    151   1.12  kiyohara 
    152   1.12  kiyohara #define PT_ROOT_CTRL	0
    153   1.12  kiyohara #define PT_ROOT_INTR	1
    154   1.12  kiyohara #define PT_CTRL_SETUP	2
    155   1.12  kiyohara #define PT_CTRL_DATA	3
    156   1.12  kiyohara #define PT_CTRL_STATUS	4
    157   1.12  kiyohara #define PT_INTR		5
    158   1.12  kiyohara #define PT_BULK		6
    159   1.12  kiyohara #define PT_MAX		6
    160   1.12  kiyohara 
    161   1.12  kiyohara #ifdef SLHCI_DEBUG
    162   1.12  kiyohara #define SLHCI_MEM_ACCOUNTING
    163   1.12  kiyohara #endif
    164   1.12  kiyohara 
    165   1.34     skrll /*
    166   1.34     skrll  * Maximum allowable reserved bus time.  Since intr/isoc transfers have
    167   1.37     skrll  * unconditional priority, this is all that ensures control and bulk transfers
    168   1.37     skrll  * get a chance.  It is a single value for all frames since all transfers can
    169   1.37     skrll  * use multiple consecutive frames if an error is encountered.  Note that it
    170   1.37     skrll  * is not really possible to fill the bus with transfers, so this value should
    171   1.37     skrll  * be on the low side.  Defaults to giving a warning unless SLHCI_NO_OVERTIME
    172   1.34     skrll  * is defined.  Full time is 12000 - END_BUSTIME.
    173   1.34     skrll  */
    174   1.12  kiyohara #ifndef SLHCI_RESERVED_BUSTIME
    175   1.12  kiyohara #define SLHCI_RESERVED_BUSTIME 5000
    176   1.12  kiyohara #endif
    177   1.12  kiyohara 
    178   1.34     skrll /*
    179   1.34     skrll  * Rate for "exceeds reserved bus time" warnings (default) or errors.
    180   1.37     skrll  * Warnings only happen when an endpoint open causes the time to go above
    181   1.34     skrll  * SLHCI_RESERVED_BUSTIME, not if it is already above.
    182   1.34     skrll  */
    183   1.12  kiyohara #ifndef SLHCI_OVERTIME_WARNING_RATE
    184   1.12  kiyohara #define SLHCI_OVERTIME_WARNING_RATE { 60, 0 } /* 60 seconds */
    185   1.12  kiyohara #endif
    186   1.12  kiyohara static const struct timeval reserved_warn_rate = SLHCI_OVERTIME_WARNING_RATE;
    187   1.12  kiyohara 
    188   1.34     skrll /*
    189   1.34     skrll  * For EOF, the spec says 42 bit times, plus (I think) a possible hub skew of
    190   1.12  kiyohara  * 20 bit times.  By default leave 66 bit times to start the transfer beyond
    191   1.12  kiyohara  * the required time.  Units are full-speed bit times (a bit over 5us per 64).
    192   1.34     skrll  * Only multiples of 64 are significant.
    193   1.34     skrll  */
    194   1.12  kiyohara #define SLHCI_STANDARD_END_BUSTIME 128
    195   1.12  kiyohara #ifndef SLHCI_EXTRA_END_BUSTIME
    196   1.12  kiyohara #define SLHCI_EXTRA_END_BUSTIME 0
    197   1.12  kiyohara #endif
    198   1.12  kiyohara 
    199   1.12  kiyohara #define SLHCI_END_BUSTIME (SLHCI_STANDARD_END_BUSTIME+SLHCI_EXTRA_END_BUSTIME)
    200   1.12  kiyohara 
    201   1.34     skrll /*
    202   1.34     skrll  * This is an approximation of the USB worst-case timings presented on p. 54 of
    203   1.37     skrll  * the USB 1.1 spec translated to full speed bit times.
    204   1.37     skrll  * FS = full speed with handshake, FSII = isoc in, FSIO = isoc out,
    205   1.34     skrll  * FSI = isoc (worst case), LS = low speed
    206   1.34     skrll  */
    207   1.12  kiyohara #define SLHCI_FS_CONST		114
    208   1.12  kiyohara #define SLHCI_FSII_CONST	92
    209   1.12  kiyohara #define SLHCI_FSIO_CONST	80
    210   1.12  kiyohara #define SLHCI_FSI_CONST		92
    211   1.12  kiyohara #define SLHCI_LS_CONST		804
    212   1.12  kiyohara #ifndef SLHCI_PRECICE_BUSTIME
    213   1.34     skrll /*
    214   1.34     skrll  * These values are < 3% too high (compared to the multiply and divide) for
    215   1.34     skrll  * max sized packets.
    216   1.34     skrll  */
    217   1.12  kiyohara #define SLHCI_FS_DATA_TIME(len) (((u_int)(len)<<3)+(len)+((len)>>1))
    218   1.12  kiyohara #define SLHCI_LS_DATA_TIME(len) (((u_int)(len)<<6)+((u_int)(len)<<4))
    219   1.12  kiyohara #else
    220   1.12  kiyohara #define SLHCI_FS_DATA_TIME(len) (56*(len)/6)
    221   1.12  kiyohara #define SLHCI_LS_DATA_TIME(len) (449*(len)/6)
    222   1.12  kiyohara #endif
    223   1.12  kiyohara 
    224   1.34     skrll /*
    225   1.34     skrll  * Set SLHCI_WAIT_SIZE to the desired maximum size of single FS transfer
    226   1.12  kiyohara  * to poll for after starting a transfer.  64 gets all full speed transfers.
    227   1.36     skrll  * Note that even if 0 polling will occur if data equal or greater than the
    228   1.12  kiyohara  * transfer size is copied to the chip while the transfer is in progress.
    229   1.12  kiyohara  * Setting SLHCI_WAIT_TIME to -12000 will disable polling.
    230   1.12  kiyohara  */
    231   1.12  kiyohara #ifndef SLHCI_WAIT_SIZE
    232   1.12  kiyohara #define SLHCI_WAIT_SIZE 8
    233   1.12  kiyohara #endif
    234   1.12  kiyohara #ifndef SLHCI_WAIT_TIME
    235   1.12  kiyohara #define SLHCI_WAIT_TIME (SLHCI_FS_CONST + \
    236   1.12  kiyohara     SLHCI_FS_DATA_TIME(SLHCI_WAIT_SIZE))
    237   1.12  kiyohara #endif
    238   1.12  kiyohara const int slhci_wait_time = SLHCI_WAIT_TIME;
    239    1.1     isaki 
    240   1.12  kiyohara #ifndef SLHCI_MAX_RETRIES
    241   1.12  kiyohara #define SLHCI_MAX_RETRIES 3
    242   1.12  kiyohara #endif
    243    1.1     isaki 
    244   1.12  kiyohara /* Check IER values for corruption after this many unrecognized interrupts. */
    245   1.12  kiyohara #ifndef SLHCI_IER_CHECK_FREQUENCY
    246    1.1     isaki #ifdef SLHCI_DEBUG
    247   1.12  kiyohara #define SLHCI_IER_CHECK_FREQUENCY 1
    248    1.1     isaki #else
    249   1.12  kiyohara #define SLHCI_IER_CHECK_FREQUENCY 100
    250    1.1     isaki #endif
    251   1.12  kiyohara #endif
    252   1.12  kiyohara 
    253   1.12  kiyohara /* Note that buffer points to the start of the buffer for this transfer.  */
    254   1.12  kiyohara struct slhci_pipe {
    255   1.12  kiyohara 	struct usbd_pipe pipe;
    256   1.12  kiyohara 	struct usbd_xfer *xfer;		/* xfer in progress */
    257   1.12  kiyohara 	uint8_t		*buffer;	/* I/O buffer (if needed) */
    258   1.12  kiyohara 	struct gcq 	ap;		/* All pipes */
    259   1.12  kiyohara 	struct gcq 	to;		/* Timeout list */
    260   1.12  kiyohara 	struct gcq 	xq;		/* Xfer queues */
    261   1.12  kiyohara 	unsigned int	pflags;		/* Pipe flags */
    262   1.12  kiyohara #define PF_GONE		(0x01)		/* Pipe is on disabled device */
    263   1.12  kiyohara #define PF_TOGGLE 	(0x02)		/* Data toggle status */
    264   1.12  kiyohara #define PF_LS		(0x04)		/* Pipe is low speed */
    265   1.12  kiyohara #define PF_PREAMBLE	(0x08)		/* Needs preamble */
    266   1.12  kiyohara 	Frame		to_frame;	/* Frame number for timeout */
    267   1.12  kiyohara 	Frame		frame;		/* Frame number for intr xfer */
    268   1.12  kiyohara 	Frame		lastframe;	/* Previous frame number for intr */
    269   1.12  kiyohara 	uint16_t	bustime;	/* Worst case bus time usage */
    270   1.12  kiyohara 	uint16_t	newbustime[2];	/* new bustimes (see index below) */
    271   1.12  kiyohara 	uint8_t		tregs[4];	/* ADR, LEN, PID, DEV */
    272   1.12  kiyohara 	uint8_t		newlen[2];	/* 0 = short data, 1 = ctrl data */
    273   1.12  kiyohara 	uint8_t		newpid;		/* for ctrl */
    274   1.12  kiyohara 	uint8_t		wantshort;	/* last xfer must be short */
    275   1.12  kiyohara 	uint8_t		control;	/* Host control register settings */
    276   1.12  kiyohara 	uint8_t		nerrs;		/* Current number of errors */
    277   1.12  kiyohara 	uint8_t 	ptype;		/* Pipe type */
    278   1.12  kiyohara };
    279    1.1     isaki 
    280   1.48     skrll #define SLHCI_BUS2SC(bus)	((bus)->ub_hcpriv)
    281   1.48     skrll #define SLHCI_PIPE2SC(pipe)	SLHCI_BUS2SC((pipe)->up_dev->ud_bus)
    282   1.48     skrll #define SLHCI_XFER2SC(xfer)	SLHCI_BUS2SC((xfer)->ux_bus)
    283   1.48     skrll 
    284   1.48     skrll #define SLHCI_PIPE2SPIPE(pipe)	((struct slhci_pipe *)(pipe))
    285   1.55     skrll #define SLHCI_XFER2SPIPE(xfer)	SLHCI_PIPE2SPIPE((xfer)->ux_pipe)
    286   1.55     skrll 
    287   1.55     skrll #define SLHCI_XFER_TYPE(x)	(SLHCI_XFER2SPIPE(xfer)->ptype)
    288   1.48     skrll 
    289   1.12  kiyohara #ifdef SLHCI_PROFILE_TRANSFER
    290   1.12  kiyohara #if defined(__mips__)
    291   1.34     skrll /*
    292   1.34     skrll  * MIPS cycle counter does not directly count cpu cycles but is a different
    293   1.34     skrll  * fraction of cpu cycles depending on the cpu.
    294   1.34     skrll  */
    295   1.48     skrll typedef uint32_t cc_type;
    296   1.12  kiyohara #define CC_TYPE_FMT "%u"
    297   1.12  kiyohara #define slhci_cc_set(x) __asm volatile ("mfc0 %[cc], $9\n\tnop\n\tnop\n\tnop" \
    298   1.12  kiyohara     : [cc] "=r"(x))
    299   1.12  kiyohara #elif defined(__i386__)
    300   1.48     skrll typedef uint64_t cc_type;
    301   1.12  kiyohara #define CC_TYPE_FMT "%llu"
    302   1.12  kiyohara #define slhci_cc_set(x) __asm volatile ("rdtsc" : "=A"(x))
    303   1.12  kiyohara #else
    304   1.12  kiyohara #error "SLHCI_PROFILE_TRANSFER not implemented on this MACHINE_ARCH (see sys/dev/ic/sl811hs.c)"
    305   1.12  kiyohara #endif
    306   1.12  kiyohara struct slhci_cc_time {
    307   1.12  kiyohara 	cc_type start;
    308   1.12  kiyohara 	cc_type stop;
    309   1.12  kiyohara 	unsigned int miscdata;
    310   1.12  kiyohara };
    311   1.12  kiyohara #ifndef SLHCI_N_TIMES
    312   1.12  kiyohara #define SLHCI_N_TIMES 200
    313   1.12  kiyohara #endif
    314   1.12  kiyohara struct slhci_cc_times {
    315   1.12  kiyohara 	struct slhci_cc_time times[SLHCI_N_TIMES];
    316   1.12  kiyohara 	int current;
    317   1.12  kiyohara 	int wraparound;
    318    1.1     isaki };
    319    1.1     isaki 
    320   1.12  kiyohara static struct slhci_cc_times t_ab[2];
    321   1.12  kiyohara static struct slhci_cc_times t_abdone;
    322   1.12  kiyohara static struct slhci_cc_times t_copy_to_dev;
    323   1.12  kiyohara static struct slhci_cc_times t_copy_from_dev;
    324   1.12  kiyohara static struct slhci_cc_times t_intr;
    325   1.12  kiyohara static struct slhci_cc_times t_lock;
    326   1.12  kiyohara static struct slhci_cc_times t_delay;
    327   1.12  kiyohara static struct slhci_cc_times t_hard_int;
    328   1.12  kiyohara static struct slhci_cc_times t_callback;
    329   1.12  kiyohara 
    330   1.12  kiyohara static inline void
    331   1.12  kiyohara start_cc_time(struct slhci_cc_times *times, unsigned int misc) {
    332   1.12  kiyohara 	times->times[times->current].miscdata = misc;
    333   1.12  kiyohara 	slhci_cc_set(times->times[times->current].start);
    334   1.12  kiyohara }
    335   1.12  kiyohara static inline void
    336   1.12  kiyohara stop_cc_time(struct slhci_cc_times *times) {
    337   1.12  kiyohara 	slhci_cc_set(times->times[times->current].stop);
    338   1.12  kiyohara 	if (++times->current >= SLHCI_N_TIMES) {
    339   1.12  kiyohara 		times->current = 0;
    340   1.12  kiyohara 		times->wraparound = 1;
    341   1.12  kiyohara 	}
    342   1.12  kiyohara }
    343   1.12  kiyohara 
    344   1.12  kiyohara void slhci_dump_cc_times(int);
    345   1.12  kiyohara 
    346   1.12  kiyohara void
    347   1.12  kiyohara slhci_dump_cc_times(int n) {
    348   1.12  kiyohara 	struct slhci_cc_times *times;
    349   1.12  kiyohara 	int i;
    350   1.12  kiyohara 
    351   1.12  kiyohara 	switch (n) {
    352   1.12  kiyohara 	default:
    353   1.12  kiyohara 	case 0:
    354   1.12  kiyohara 		printf("USBA start transfer to intr:\n");
    355   1.12  kiyohara 		times = &t_ab[A];
    356   1.12  kiyohara 		break;
    357   1.12  kiyohara 	case 1:
    358   1.12  kiyohara 		printf("USBB start transfer to intr:\n");
    359   1.12  kiyohara 		times = &t_ab[B];
    360   1.12  kiyohara 		break;
    361   1.12  kiyohara 	case 2:
    362   1.12  kiyohara 		printf("abdone:\n");
    363   1.12  kiyohara 		times = &t_abdone;
    364   1.12  kiyohara 		break;
    365   1.12  kiyohara 	case 3:
    366   1.12  kiyohara 		printf("copy to device:\n");
    367   1.12  kiyohara 		times = &t_copy_to_dev;
    368   1.12  kiyohara 		break;
    369   1.12  kiyohara 	case 4:
    370   1.12  kiyohara 		printf("copy from device:\n");
    371   1.12  kiyohara 		times = &t_copy_from_dev;
    372   1.12  kiyohara 		break;
    373   1.12  kiyohara 	case 5:
    374   1.12  kiyohara 		printf("intr to intr:\n");
    375   1.12  kiyohara 		times = &t_intr;
    376   1.12  kiyohara 		break;
    377   1.12  kiyohara 	case 6:
    378   1.12  kiyohara 		printf("lock to release:\n");
    379   1.12  kiyohara 		times = &t_lock;
    380   1.12  kiyohara 		break;
    381   1.12  kiyohara 	case 7:
    382   1.12  kiyohara 		printf("delay time:\n");
    383   1.12  kiyohara 		times = &t_delay;
    384   1.12  kiyohara 		break;
    385   1.12  kiyohara 	case 8:
    386   1.12  kiyohara 		printf("hard interrupt enter to exit:\n");
    387   1.12  kiyohara 		times = &t_hard_int;
    388   1.12  kiyohara 		break;
    389   1.12  kiyohara 	case 9:
    390   1.12  kiyohara 		printf("callback:\n");
    391   1.12  kiyohara 		times = &t_callback;
    392   1.12  kiyohara 		break;
    393   1.12  kiyohara 	}
    394   1.12  kiyohara 
    395   1.12  kiyohara 	if (times->wraparound)
    396   1.12  kiyohara 		for (i = times->current + 1; i < SLHCI_N_TIMES; i++)
    397   1.36     skrll 			printf("start " CC_TYPE_FMT " stop " CC_TYPE_FMT
    398   1.36     skrll 			    " difference %8i miscdata %#x\n",
    399   1.36     skrll 			    times->times[i].start, times->times[i].stop,
    400   1.36     skrll 			    (int)(times->times[i].stop -
    401   1.12  kiyohara 			    times->times[i].start), times->times[i].miscdata);
    402   1.12  kiyohara 
    403   1.12  kiyohara 	for (i = 0; i < times->current; i++)
    404   1.36     skrll 		printf("start " CC_TYPE_FMT " stop " CC_TYPE_FMT
    405   1.36     skrll 		    " difference %8i miscdata %#x\n", times->times[i].start,
    406   1.36     skrll 		    times->times[i].stop, (int)(times->times[i].stop -
    407   1.12  kiyohara 		    times->times[i].start), times->times[i].miscdata);
    408   1.12  kiyohara }
    409   1.12  kiyohara #else
    410   1.12  kiyohara #define start_cc_time(x, y)
    411   1.12  kiyohara #define stop_cc_time(x)
    412   1.12  kiyohara #endif /* SLHCI_PROFILE_TRANSFER */
    413   1.12  kiyohara 
    414   1.36     skrll typedef usbd_status (*LockCallFunc)(struct slhci_softc *, struct slhci_pipe
    415   1.12  kiyohara     *, struct usbd_xfer *);
    416   1.12  kiyohara 
    417   1.48     skrll struct usbd_xfer * slhci_allocx(struct usbd_bus *, unsigned int);
    418   1.12  kiyohara void slhci_freex(struct usbd_bus *, struct usbd_xfer *);
    419   1.41     skrll static void slhci_get_lock(struct usbd_bus *, kmutex_t **);
    420   1.12  kiyohara 
    421   1.12  kiyohara usbd_status slhci_transfer(struct usbd_xfer *);
    422   1.12  kiyohara usbd_status slhci_start(struct usbd_xfer *);
    423   1.12  kiyohara usbd_status slhci_root_start(struct usbd_xfer *);
    424   1.12  kiyohara usbd_status slhci_open(struct usbd_pipe *);
    425   1.12  kiyohara 
    426   1.48     skrll static int slhci_roothub_ctrl(struct usbd_bus *, usb_device_request_t *,
    427   1.48     skrll     void *, int);
    428   1.48     skrll 
    429   1.34     skrll /*
    430   1.34     skrll  * slhci_supported_rev, slhci_preinit, slhci_attach, slhci_detach,
    431   1.34     skrll  * slhci_activate
    432   1.34     skrll  */
    433   1.12  kiyohara 
    434   1.12  kiyohara void slhci_abort(struct usbd_xfer *);
    435   1.12  kiyohara void slhci_close(struct usbd_pipe *);
    436   1.12  kiyohara void slhci_clear_toggle(struct usbd_pipe *);
    437   1.12  kiyohara void slhci_poll(struct usbd_bus *);
    438   1.12  kiyohara void slhci_done(struct usbd_xfer *);
    439   1.12  kiyohara void slhci_void(void *);
    440   1.12  kiyohara 
    441   1.12  kiyohara /* lock entry functions */
    442   1.12  kiyohara 
    443   1.12  kiyohara #ifdef SLHCI_MEM_ACCOUNTING
    444   1.12  kiyohara void slhci_mem_use(struct usbd_bus *, int);
    445   1.12  kiyohara #endif
    446   1.12  kiyohara 
    447   1.12  kiyohara void slhci_reset_entry(void *);
    448   1.36     skrll usbd_status slhci_lock_call(struct slhci_softc *, LockCallFunc,
    449   1.12  kiyohara     struct slhci_pipe *, struct usbd_xfer *);
    450   1.12  kiyohara void slhci_start_entry(struct slhci_softc *, struct slhci_pipe *);
    451   1.12  kiyohara void slhci_callback_entry(void *arg);
    452   1.41     skrll void slhci_do_callback(struct slhci_softc *, struct usbd_xfer *);
    453   1.12  kiyohara 
    454   1.12  kiyohara /* slhci_intr */
    455   1.12  kiyohara 
    456   1.41     skrll void slhci_main(struct slhci_softc *);
    457   1.12  kiyohara 
    458   1.12  kiyohara /* in lock functions */
    459   1.12  kiyohara 
    460   1.12  kiyohara static void slhci_write(struct slhci_softc *, uint8_t, uint8_t);
    461   1.12  kiyohara static uint8_t slhci_read(struct slhci_softc *, uint8_t);
    462   1.12  kiyohara static void slhci_write_multi(struct slhci_softc *, uint8_t, uint8_t *, int);
    463   1.12  kiyohara static void slhci_read_multi(struct slhci_softc *, uint8_t, uint8_t *, int);
    464   1.12  kiyohara 
    465   1.12  kiyohara static void slhci_waitintr(struct slhci_softc *, int);
    466   1.12  kiyohara static int slhci_dointr(struct slhci_softc *);
    467   1.12  kiyohara static void slhci_abdone(struct slhci_softc *, int);
    468   1.12  kiyohara static void slhci_tstart(struct slhci_softc *);
    469   1.12  kiyohara static void slhci_dotransfer(struct slhci_softc *);
    470   1.12  kiyohara 
    471   1.41     skrll static void slhci_callback(struct slhci_softc *);
    472   1.12  kiyohara static void slhci_enter_xfer(struct slhci_softc *, struct slhci_pipe *);
    473   1.12  kiyohara static void slhci_enter_xfers(struct slhci_softc *);
    474   1.12  kiyohara static void slhci_queue_timed(struct slhci_softc *, struct slhci_pipe *);
    475   1.12  kiyohara static void slhci_xfer_timer(struct slhci_softc *, struct slhci_pipe *);
    476   1.12  kiyohara 
    477   1.12  kiyohara static void slhci_callback_schedule(struct slhci_softc *);
    478   1.12  kiyohara static void slhci_do_callback_schedule(struct slhci_softc *);
    479   1.12  kiyohara #if 0
    480   1.41     skrll void slhci_pollxfer(struct slhci_softc *, struct usbd_xfer *); /* XXX */
    481   1.12  kiyohara #endif
    482   1.12  kiyohara 
    483   1.36     skrll static usbd_status slhci_do_poll(struct slhci_softc *, struct slhci_pipe *,
    484   1.12  kiyohara     struct usbd_xfer *);
    485   1.36     skrll static usbd_status slhci_lsvh_warn(struct slhci_softc *, struct slhci_pipe *,
    486   1.12  kiyohara     struct usbd_xfer *);
    487   1.36     skrll static usbd_status slhci_isoc_warn(struct slhci_softc *, struct slhci_pipe *,
    488   1.12  kiyohara     struct usbd_xfer *);
    489   1.36     skrll static usbd_status slhci_open_pipe(struct slhci_softc *, struct slhci_pipe *,
    490   1.12  kiyohara     struct usbd_xfer *);
    491   1.36     skrll static usbd_status slhci_close_pipe(struct slhci_softc *, struct slhci_pipe *,
    492   1.12  kiyohara     struct usbd_xfer *);
    493   1.36     skrll static usbd_status slhci_do_abort(struct slhci_softc *, struct slhci_pipe *,
    494   1.12  kiyohara     struct usbd_xfer *);
    495   1.36     skrll static usbd_status slhci_halt(struct slhci_softc *, struct slhci_pipe *,
    496   1.12  kiyohara     struct usbd_xfer *);
    497   1.12  kiyohara 
    498   1.12  kiyohara static void slhci_intrchange(struct slhci_softc *, uint8_t);
    499   1.12  kiyohara static void slhci_drain(struct slhci_softc *);
    500   1.12  kiyohara static void slhci_reset(struct slhci_softc *);
    501   1.36     skrll static int slhci_reserve_bustime(struct slhci_softc *, struct slhci_pipe *,
    502   1.12  kiyohara     int);
    503   1.12  kiyohara static void slhci_insert(struct slhci_softc *);
    504   1.12  kiyohara 
    505   1.12  kiyohara static usbd_status slhci_clear_feature(struct slhci_softc *, unsigned int);
    506   1.12  kiyohara static usbd_status slhci_set_feature(struct slhci_softc *, unsigned int);
    507   1.12  kiyohara static void slhci_get_status(struct slhci_softc *, usb_port_status_t *);
    508   1.12  kiyohara 
    509   1.56     skrll #define	SLHCIHIST_FUNC()	USBHIST_FUNC()
    510   1.56     skrll #define	SLHCIHIST_CALLED()	USBHIST_CALLED(slhcidebug)
    511   1.56     skrll 
    512   1.12  kiyohara #ifdef SLHCI_DEBUG
    513   1.86     skrll static int slhci_memtest(struct slhci_softc *);
    514   1.86     skrll 
    515   1.12  kiyohara void slhci_log_buffer(struct usbd_xfer *);
    516   1.12  kiyohara void slhci_log_req(usb_device_request_t *);
    517   1.12  kiyohara void slhci_log_dumpreg(void);
    518   1.12  kiyohara void slhci_log_xfer(struct usbd_xfer *);
    519   1.12  kiyohara void slhci_log_spipe(struct slhci_pipe *);
    520   1.12  kiyohara void slhci_print_intr(void);
    521   1.12  kiyohara void slhci_log_sc(void);
    522   1.12  kiyohara void slhci_log_slreq(struct slhci_pipe *);
    523   1.12  kiyohara 
    524   1.12  kiyohara /* Constified so you can read the values from ddb */
    525   1.12  kiyohara const int SLHCI_D_TRACE =	0x0001;
    526   1.12  kiyohara const int SLHCI_D_MSG = 	0x0002;
    527   1.12  kiyohara const int SLHCI_D_XFER =	0x0004;
    528   1.12  kiyohara const int SLHCI_D_MEM = 	0x0008;
    529   1.12  kiyohara const int SLHCI_D_INTR =	0x0010;
    530   1.12  kiyohara const int SLHCI_D_SXFER =	0x0020;
    531   1.12  kiyohara const int SLHCI_D_ERR = 	0x0080;
    532   1.12  kiyohara const int SLHCI_D_BUF = 	0x0100;
    533   1.12  kiyohara const int SLHCI_D_SOFT =	0x0200;
    534   1.12  kiyohara const int SLHCI_D_WAIT =	0x0400;
    535   1.12  kiyohara const int SLHCI_D_ROOT =	0x0800;
    536   1.12  kiyohara /* SOF/NAK alone normally ignored, SOF also needs D_INTR */
    537   1.12  kiyohara const int SLHCI_D_SOF =		0x1000;
    538   1.12  kiyohara const int SLHCI_D_NAK =		0x2000;
    539   1.12  kiyohara 
    540   1.51     skrll int slhcidebug = 0x1cbc; /* 0xc8c; */ /* 0xffff; */ /* 0xd8c; */
    541   1.12  kiyohara 
    542   1.56     skrll SYSCTL_SETUP(sysctl_hw_slhci_setup, "sysctl hw.slhci setup")
    543   1.56     skrll {
    544   1.56     skrll 	int err;
    545   1.56     skrll 	const struct sysctlnode *rnode;
    546   1.56     skrll 	const struct sysctlnode *cnode;
    547   1.56     skrll 
    548   1.56     skrll 	err = sysctl_createv(clog, 0, NULL, &rnode,
    549   1.56     skrll 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "slhci",
    550   1.56     skrll 	    SYSCTL_DESCR("slhci global controls"),
    551   1.56     skrll 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
    552   1.56     skrll 
    553   1.56     skrll 	if (err)
    554   1.56     skrll 		goto fail;
    555   1.56     skrll 
    556   1.56     skrll 	/* control debugging printfs */
    557   1.56     skrll 	err = sysctl_createv(clog, 0, &rnode, &cnode,
    558   1.56     skrll 	    CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
    559   1.56     skrll 	    "debug", SYSCTL_DESCR("Enable debugging output"),
    560   1.56     skrll 	    NULL, 0, &slhcidebug, sizeof(slhcidebug), CTL_CREATE, CTL_EOL);
    561   1.56     skrll 	if (err)
    562   1.56     skrll 		goto fail;
    563   1.56     skrll 
    564   1.56     skrll 	return;
    565   1.56     skrll fail:
    566   1.56     skrll 	aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err);
    567   1.56     skrll }
    568   1.28       mrg 
    569   1.56     skrll struct slhci_softc *ssc;
    570   1.12  kiyohara 
    571   1.51     skrll #define SLHCI_DEXEC(x, y) do { if ((slhcidebug & SLHCI_ ## x)) { y; } \
    572   1.12  kiyohara } while (/*CONSTCOND*/ 0)
    573   1.56     skrll #define DDOLOG(f, a, b, c, d) do { KERNHIST_LOG(usbhist, f, a, b, c, d); \
    574   1.12  kiyohara } while (/*CONSTCOND*/0)
    575   1.12  kiyohara #define DLOG(x, f, a, b, c, d) SLHCI_DEXEC(x, DDOLOG(f, a, b, c, d))
    576   1.79     skrll 
    577   1.34     skrll /*
    578   1.34     skrll  * DDOLOGBUF logs a buffer up to 8 bytes at a time. No identifier so that we
    579   1.34     skrll  * can make it a real function.
    580   1.34     skrll  */
    581   1.12  kiyohara static void
    582   1.12  kiyohara DDOLOGBUF(uint8_t *buf, unsigned int length)
    583   1.12  kiyohara {
    584   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
    585   1.12  kiyohara 	int i;
    586   1.12  kiyohara 
    587  1.104    simonb 	for(i = 0; i + 8 <= length; i += 8)
    588   1.12  kiyohara 		DDOLOG("%.4x %.4x %.4x %.4x", (buf[i] << 8) | buf[i+1],
    589   1.12  kiyohara 		    (buf[i+2] << 8) | buf[i+3], (buf[i+4] << 8) | buf[i+5],
    590   1.12  kiyohara 		    (buf[i+6] << 8) | buf[i+7]);
    591  1.104    simonb 	if (length == i + 7)
    592   1.12  kiyohara 		DDOLOG("%.4x %.4x %.4x %.2x", (buf[i] << 8) | buf[i+1],
    593   1.12  kiyohara 		    (buf[i+2] << 8) | buf[i+3], (buf[i+4] << 8) | buf[i+5],
    594   1.12  kiyohara 		    buf[i+6]);
    595  1.104    simonb 	else if (length == i + 6)
    596   1.12  kiyohara 		DDOLOG("%.4x %.4x %.4x", (buf[i] << 8) | buf[i+1],
    597   1.12  kiyohara 		    (buf[i+2] << 8) | buf[i+3], (buf[i+4] << 8) | buf[i+5], 0);
    598  1.104    simonb 	else if (length == i + 5)
    599   1.12  kiyohara 		DDOLOG("%.4x %.4x %.2x", (buf[i] << 8) | buf[i+1],
    600   1.12  kiyohara 		    (buf[i+2] << 8) | buf[i+3], buf[i+4], 0);
    601  1.104    simonb 	else if (length == i + 4)
    602   1.12  kiyohara 		DDOLOG("%.4x %.4x", (buf[i] << 8) | buf[i+1],
    603   1.12  kiyohara 		    (buf[i+2] << 8) | buf[i+3], 0,0);
    604  1.104    simonb 	else if (length == i + 3)
    605   1.12  kiyohara 		DDOLOG("%.4x %.2x", (buf[i] << 8) | buf[i+1], buf[i+2], 0,0);
    606  1.104    simonb 	else if (length == i + 2)
    607   1.12  kiyohara 		DDOLOG("%.4x", (buf[i] << 8) | buf[i+1], 0,0,0);
    608  1.104    simonb 	else if (length == i + 1)
    609   1.12  kiyohara 		DDOLOG("%.2x", buf[i], 0,0,0);
    610   1.12  kiyohara }
    611   1.12  kiyohara #define DLOGBUF(x, b, l) SLHCI_DEXEC(x, DDOLOGBUF(b, l))
    612   1.80     skrll 
    613   1.80     skrll #define DDOLOGCTRL(x)	do {						\
    614   1.98  pgoyette     DDOLOG("CTRL suspend=%jd", !!((x) & SL11_CTRL_SUSPEND), 0, 0, 0);	\
    615   1.98  pgoyette     DDOLOG("CTRL ls     =%jd  jk     =%jd  reset  =%jd  sof    =%jd",	\
    616   1.80     skrll 	!!((x) & SL11_CTRL_LOWSPEED), !!((x) & SL11_CTRL_JKSTATE),	\
    617   1.80     skrll 	!!((x) & SL11_CTRL_RESETENGINE), !!((x) & SL11_CTRL_ENABLESOF));\
    618   1.80     skrll } while (0)
    619   1.80     skrll 
    620   1.80     skrll #define DDOLOGISR(r)	do {						\
    621   1.98  pgoyette     DDOLOG("ISR  data   =%jd  det/res=%jd  insert =%jd  sof    =%jd",	\
    622   1.80     skrll 	!!((r) & SL11_ISR_DATA), !!((r) & SL11_ISR_RESUME),		\
    623   1.80     skrll 	!!((r) & SL11_ISR_INSERT), !!!!((r) & SL11_ISR_SOF));		\
    624   1.98  pgoyette     DDOLOG("ISR             babble =%jd  usbb   =%jd  usba   =%jd",	\
    625   1.80     skrll 	!!((r) & SL11_ISR_BABBLE), !!((r) & SL11_ISR_USBB),		\
    626   1.80     skrll 	!!((r) & SL11_ISR_USBA), 0);					\
    627   1.80     skrll } while (0)
    628   1.80     skrll 
    629   1.80     skrll #define DDOLOGIER(r)	do {						\
    630   1.80     skrll     DDOLOG("IER              det/res=%d  insert =%d  sof    =%d",	\
    631   1.80     skrll 	!!((r) & SL11_IER_RESUME),					\
    632   1.80     skrll 	!!((r) & SL11_IER_INSERT), !!!!((r) & SL11_IER_SOF), 0);		\
    633   1.80     skrll     DDOLOG("IER              babble =%d  usbb   =%d  usba   =%d",	\
    634   1.80     skrll 	!!((r) & SL11_IER_BABBLE), !!((r) & SL11_IER_USBB),		\
    635   1.80     skrll 	!!((r) & SL11_IER_USBA), 0);					\
    636   1.80     skrll } while (0)
    637   1.80     skrll 
    638   1.84     skrll #define DDOLOGSTATUS(s)	do {						\
    639   1.80     skrll     DDOLOG("STAT stall   =%d  nak     =%d  overflow =%d  setup   =%d",	\
    640   1.80     skrll 	!!((s) & SL11_EPSTAT_STALL), !!((s) & SL11_EPSTAT_NAK),		\
    641   1.80     skrll 	!!((s) & SL11_EPSTAT_OVERFLOW), !!((s) & SL11_EPSTAT_SETUP));	\
    642   1.82     skrll     DDOLOG("STAT sequence=%d  timeout =%d  error    =%d  ack     =%d",	\
    643   1.80     skrll 	!!((s) & SL11_EPSTAT_SEQUENCE),	!!((s) & SL11_EPSTAT_TIMEOUT),	\
    644   1.80     skrll 	!!((s) & SL11_EPSTAT_ERROR), !!((s) & SL11_EPSTAT_ACK));	\
    645   1.80     skrll } while (0)
    646   1.80     skrll 
    647   1.84     skrll #define DDOLOGEPCTRL(r)	do {						\
    648   1.80     skrll     DDOLOG("CTRL preamble=%d  toggle  =%d  sof     =%d  iso     =%d",	\
    649   1.80     skrll 	!!((r) & SL11_EPCTRL_PREAMBLE), !!((r) & SL11_EPCTRL_DATATOGGLE),\
    650   1.80     skrll 	!!((r) & SL11_EPCTRL_SOF), !!((r) & SL11_EPCTRL_ISO));		\
    651   1.80     skrll     DDOLOG("CTRL              out     =%d  enable  =%d  arm     =%d",	\
    652   1.80     skrll 	!!((r) & SL11_EPCTRL_DIRECTION),				\
    653   1.80     skrll 	!!((r) & SL11_EPCTRL_ENABLE), !!((r) & SL11_EPCTRL_ARM), 0);	\
    654   1.80     skrll } while (0)
    655   1.80     skrll 
    656   1.84     skrll #define DDOLOGEPSTAT(r)	do {						\
    657   1.80     skrll     DDOLOG("STAT stall   =%d  nak     =%d  overflow =%d  setup   =%d",	\
    658   1.80     skrll 	!!((r) & SL11_EPSTAT_STALL), !!((r) & SL11_EPSTAT_NAK),		\
    659   1.80     skrll 	!!((r) & SL11_EPSTAT_OVERFLOW), !!((r) & SL11_EPSTAT_SETUP));	\
    660   1.80     skrll     DDOLOG("STAT sequence=%d  timeout =%d  error    =%d  ack   =%d",	\
    661   1.80     skrll 	!!((r) & SL11_EPSTAT_SEQUENCE), !!((r) & SL11_EPSTAT_TIMEOUT),	\
    662   1.80     skrll 	!!((r) & SL11_EPSTAT_ERROR), !!((r) & SL11_EPSTAT_ACK));	\
    663   1.80     skrll } while (0)
    664   1.12  kiyohara #else /* now !SLHCI_DEBUG */
    665   1.56     skrll #define slhcidebug 0
    666   1.12  kiyohara #define slhci_log_spipe(spipe) ((void)0)
    667   1.12  kiyohara #define slhci_log_xfer(xfer) ((void)0)
    668   1.12  kiyohara #define SLHCI_DEXEC(x, y) ((void)0)
    669   1.12  kiyohara #define DDOLOG(f, a, b, c, d) ((void)0)
    670   1.12  kiyohara #define DLOG(x, f, a, b, c, d) ((void)0)
    671   1.12  kiyohara #define DDOLOGBUF(b, l) ((void)0)
    672   1.12  kiyohara #define DLOGBUF(x, b, l) ((void)0)
    673   1.80     skrll #define DDOLOGCTRL(x) ((void)0)
    674   1.80     skrll #define DDOLOGISR(r) ((void)0)
    675   1.80     skrll #define DDOLOGIER(r) ((void)0)
    676   1.84     skrll #define DDOLOGSTATUS(s) ((void)0)
    677   1.84     skrll #define DDOLOGEPCTRL(r) ((void)0)
    678   1.84     skrll #define DDOLOGEPSTAT(r) ((void)0)
    679   1.12  kiyohara #endif /* SLHCI_DEBUG */
    680   1.12  kiyohara 
    681   1.12  kiyohara #ifdef DIAGNOSTIC
    682   1.12  kiyohara #define LK_SLASSERT(exp, sc, spipe, xfer, ext) do {			\
    683   1.12  kiyohara 	if (!(exp)) {							\
    684   1.12  kiyohara 		printf("%s: assertion %s failed line %u function %s!"	\
    685   1.12  kiyohara 		" halted\n", SC_NAME(sc), #exp, __LINE__, __func__);\
    686   1.12  kiyohara 		slhci_halt(sc, spipe, xfer);				\
    687   1.12  kiyohara 		ext;							\
    688   1.12  kiyohara 	}								\
    689   1.12  kiyohara } while (/*CONSTCOND*/0)
    690   1.12  kiyohara #define UL_SLASSERT(exp, sc, spipe, xfer, ext) do {			\
    691   1.12  kiyohara 	if (!(exp)) {							\
    692   1.12  kiyohara 		printf("%s: assertion %s failed line %u function %s!"	\
    693   1.12  kiyohara 		" halted\n", SC_NAME(sc), #exp, __LINE__, __func__);	\
    694   1.12  kiyohara 		slhci_lock_call(sc, &slhci_halt, spipe, xfer);		\
    695   1.12  kiyohara 		ext;							\
    696   1.12  kiyohara 	}								\
    697   1.12  kiyohara } while (/*CONSTCOND*/0)
    698   1.12  kiyohara #else
    699   1.12  kiyohara #define LK_SLASSERT(exp, sc, spipe, xfer, ext) ((void)0)
    700   1.12  kiyohara #define UL_SLASSERT(exp, sc, spipe, xfer, ext) ((void)0)
    701   1.12  kiyohara #endif
    702   1.12  kiyohara 
    703   1.12  kiyohara const struct usbd_bus_methods slhci_bus_methods = {
    704   1.48     skrll 	.ubm_open = slhci_open,
    705  1.104    simonb 	.ubm_softint = slhci_void,
    706   1.48     skrll 	.ubm_dopoll = slhci_poll,
    707   1.48     skrll 	.ubm_allocx = slhci_allocx,
    708   1.48     skrll 	.ubm_freex = slhci_freex,
    709   1.48     skrll 	.ubm_getlock = slhci_get_lock,
    710   1.48     skrll 	.ubm_rhctrl = slhci_roothub_ctrl,
    711    1.1     isaki };
    712    1.1     isaki 
    713   1.12  kiyohara const struct usbd_pipe_methods slhci_pipe_methods = {
    714   1.48     skrll 	.upm_transfer = slhci_transfer,
    715   1.48     skrll 	.upm_start = slhci_start,
    716   1.48     skrll 	.upm_abort = slhci_abort,
    717   1.48     skrll 	.upm_close = slhci_close,
    718   1.48     skrll 	.upm_cleartoggle = slhci_clear_toggle,
    719   1.48     skrll 	.upm_done = slhci_done,
    720    1.1     isaki };
    721    1.1     isaki 
    722   1.12  kiyohara const struct usbd_pipe_methods slhci_root_methods = {
    723   1.48     skrll 	.upm_transfer = slhci_transfer,
    724   1.48     skrll 	.upm_start = slhci_root_start,
    725   1.48     skrll 	.upm_abort = slhci_abort,
    726   1.48     skrll 	.upm_close = (void (*)(struct usbd_pipe *))slhci_void, /* XXX safe? */
    727   1.48     skrll 	.upm_cleartoggle = slhci_clear_toggle,
    728   1.48     skrll 	.upm_done = slhci_done,
    729    1.1     isaki };
    730    1.1     isaki 
    731   1.12  kiyohara /* Queue inlines */
    732   1.12  kiyohara 
    733   1.12  kiyohara #define GOT_FIRST_TO(tvar, t) \
    734   1.12  kiyohara     GCQ_GOT_FIRST_TYPED(tvar, &(t)->to, struct slhci_pipe, to)
    735   1.12  kiyohara 
    736   1.12  kiyohara #define FIND_TO(var, t, tvar, cond) \
    737   1.12  kiyohara     GCQ_FIND_TYPED(var, &(t)->to, tvar, struct slhci_pipe, to, cond)
    738   1.12  kiyohara 
    739   1.12  kiyohara #define FOREACH_AP(var, t, tvar) \
    740   1.12  kiyohara     GCQ_FOREACH_TYPED(var, &(t)->ap, tvar, struct slhci_pipe, ap)
    741    1.1     isaki 
    742   1.12  kiyohara #define GOT_FIRST_TIMED_COND(tvar, t, cond) \
    743   1.12  kiyohara     GCQ_GOT_FIRST_COND_TYPED(tvar, &(t)->timed, struct slhci_pipe, xq, cond)
    744    1.1     isaki 
    745   1.12  kiyohara #define GOT_FIRST_CB(tvar, t) \
    746   1.12  kiyohara     GCQ_GOT_FIRST_TYPED(tvar, &(t)->q[Q_CB], struct slhci_pipe, xq)
    747    1.1     isaki 
    748   1.12  kiyohara #define DEQUEUED_CALLBACK(tvar, t) \
    749   1.12  kiyohara     GCQ_DEQUEUED_FIRST_TYPED(tvar, &(t)->q[Q_CALLBACKS], struct slhci_pipe, xq)
    750    1.1     isaki 
    751   1.12  kiyohara #define FIND_TIMED(var, t, tvar, cond) \
    752   1.12  kiyohara    GCQ_FIND_TYPED(var, &(t)->timed, tvar, struct slhci_pipe, xq, cond)
    753    1.1     isaki 
    754   1.12  kiyohara #define DEQUEUED_WAITQ(tvar, sc) \
    755   1.12  kiyohara     GCQ_DEQUEUED_FIRST_TYPED(tvar, &(sc)->sc_waitq, struct slhci_pipe, xq)
    756    1.1     isaki 
    757   1.12  kiyohara static inline void
    758   1.12  kiyohara enter_waitq(struct slhci_softc *sc, struct slhci_pipe *spipe)
    759    1.1     isaki {
    760   1.12  kiyohara 	gcq_insert_tail(&sc->sc_waitq, &spipe->xq);
    761    1.1     isaki }
    762    1.1     isaki 
    763    1.1     isaki static inline void
    764   1.12  kiyohara enter_q(struct slhci_transfers *t, struct slhci_pipe *spipe, int i)
    765    1.1     isaki {
    766   1.12  kiyohara 	gcq_insert_tail(&t->q[i], &spipe->xq);
    767    1.1     isaki }
    768    1.1     isaki 
    769    1.1     isaki static inline void
    770   1.12  kiyohara enter_callback(struct slhci_transfers *t, struct slhci_pipe *spipe)
    771    1.1     isaki {
    772   1.12  kiyohara 	gcq_insert_tail(&t->q[Q_CALLBACKS], &spipe->xq);
    773    1.1     isaki }
    774    1.1     isaki 
    775    1.1     isaki static inline void
    776   1.12  kiyohara enter_all_pipes(struct slhci_transfers *t, struct slhci_pipe *spipe)
    777    1.1     isaki {
    778   1.12  kiyohara 	gcq_insert_tail(&t->ap, &spipe->ap);
    779    1.1     isaki }
    780    1.1     isaki 
    781   1.12  kiyohara /* Start out of lock functions. */
    782   1.12  kiyohara 
    783   1.12  kiyohara struct usbd_xfer *
    784   1.48     skrll slhci_allocx(struct usbd_bus *bus, unsigned int nframes)
    785    1.1     isaki {
    786   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
    787   1.12  kiyohara 	struct usbd_xfer *xfer;
    788   1.12  kiyohara 
    789   1.48     skrll 	xfer = kmem_zalloc(sizeof(*xfer), KM_SLEEP);
    790    1.1     isaki 
    791   1.98  pgoyette 	DLOG(D_MEM, "allocx %#jx", (uintptr_t)xfer, 0,0,0);
    792   1.12  kiyohara 
    793   1.12  kiyohara #ifdef SLHCI_MEM_ACCOUNTING
    794   1.12  kiyohara 	slhci_mem_use(bus, 1);
    795   1.12  kiyohara #endif
    796   1.12  kiyohara #ifdef DIAGNOSTIC
    797   1.12  kiyohara 	if (xfer != NULL)
    798   1.48     skrll 		xfer->ux_state = XFER_BUSY;
    799   1.12  kiyohara #endif
    800   1.12  kiyohara 	return xfer;
    801   1.12  kiyohara }
    802   1.12  kiyohara 
    803   1.12  kiyohara void
    804   1.12  kiyohara slhci_freex(struct usbd_bus *bus, struct usbd_xfer *xfer)
    805   1.12  kiyohara {
    806   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
    807   1.98  pgoyette 	DLOG(D_MEM, "freex xfer %#jx spipe %#jx",
    808   1.98  pgoyette 	    (uintptr_t)xfer, (uintptr_t)xfer->ux_pipe,0,0);
    809    1.1     isaki 
    810   1.12  kiyohara #ifdef SLHCI_MEM_ACCOUNTING
    811   1.12  kiyohara 	slhci_mem_use(bus, -1);
    812   1.12  kiyohara #endif
    813   1.12  kiyohara #ifdef DIAGNOSTIC
    814  1.101       rin 	if (xfer->ux_state != XFER_BUSY &&
    815  1.101       rin 	    xfer->ux_status != USBD_NOT_STARTED) {
    816   1.48     skrll 		struct slhci_softc *sc = SLHCI_BUS2SC(bus);
    817   1.36     skrll 		printf("%s: slhci_freex: xfer=%p not busy, %#08x halted\n",
    818   1.48     skrll 		    SC_NAME(sc), xfer, xfer->ux_state);
    819   1.79     skrll 		DDOLOG("xfer=%p not busy, %#08x halted\n", xfer,
    820   1.79     skrll 		    xfer->ux_state, 0, 0);
    821   1.12  kiyohara 		slhci_lock_call(sc, &slhci_halt, NULL, NULL);
    822   1.12  kiyohara 		return;
    823    1.1     isaki 	}
    824   1.48     skrll 	xfer->ux_state = XFER_FREE;
    825   1.12  kiyohara #endif
    826    1.1     isaki 
    827   1.48     skrll 	kmem_free(xfer, sizeof(*xfer));
    828   1.12  kiyohara }
    829    1.1     isaki 
    830   1.41     skrll static void
    831   1.41     skrll slhci_get_lock(struct usbd_bus *bus, kmutex_t **lock)
    832   1.41     skrll {
    833   1.48     skrll 	struct slhci_softc *sc = SLHCI_BUS2SC(bus);
    834   1.41     skrll 
    835   1.41     skrll 	*lock = &sc->sc_lock;
    836   1.41     skrll }
    837   1.41     skrll 
    838   1.12  kiyohara usbd_status
    839   1.12  kiyohara slhci_transfer(struct usbd_xfer *xfer)
    840   1.12  kiyohara {
    841   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
    842   1.12  kiyohara 	usbd_status error;
    843    1.1     isaki 
    844   1.98  pgoyette 	DLOG(D_TRACE, "transfer type %jd xfer %#jx spipe %#jx ",
    845   1.98  pgoyette 	    SLHCI_XFER_TYPE(xfer), (uintptr_t)xfer, (uintptr_t)xfer->ux_pipe,
    846   1.98  pgoyette 	    0);
    847    1.1     isaki 
    848  1.109  riastrad 	/* Pipe isn't running, so start it first.  */
    849   1.48     skrll 	error = xfer->ux_pipe->up_methods->upm_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
    850    1.1     isaki 
    851   1.12  kiyohara 	return error;
    852    1.1     isaki }
    853    1.1     isaki 
    854   1.12  kiyohara /* It is not safe for start to return anything other than USBD_INPROG. */
    855   1.12  kiyohara usbd_status
    856   1.12  kiyohara slhci_start(struct usbd_xfer *xfer)
    857    1.1     isaki {
    858   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
    859   1.48     skrll 	struct slhci_softc *sc = SLHCI_XFER2SC(xfer);
    860   1.48     skrll 	struct usbd_pipe *pipe = xfer->ux_pipe;
    861   1.48     skrll 	struct slhci_pipe *spipe = SLHCI_PIPE2SPIPE(pipe);
    862   1.41     skrll 	struct slhci_transfers *t = &sc->sc_transfers;
    863   1.48     skrll 	usb_endpoint_descriptor_t *ed = pipe->up_endpoint->ue_edesc;
    864   1.12  kiyohara 	unsigned int max_packet;
    865   1.12  kiyohara 
    866  1.110  riastrad 	KASSERT(sc->sc_bus.ub_usepolling || mutex_owned(&sc->sc_lock));
    867   1.12  kiyohara 
    868   1.12  kiyohara 	max_packet = UGETW(ed->wMaxPacketSize);
    869   1.12  kiyohara 
    870   1.98  pgoyette 	DLOG(D_TRACE, "transfer type %jd start xfer %#jx spipe %#jx length %jd",
    871   1.98  pgoyette 	    spipe->ptype, (uintptr_t)xfer, (uintptr_t)spipe, xfer->ux_length);
    872   1.12  kiyohara 
    873   1.12  kiyohara 	/* root transfers use slhci_root_start */
    874   1.12  kiyohara 
    875   1.12  kiyohara 	KASSERT(spipe->xfer == NULL); /* not SLASSERT */
    876   1.12  kiyohara 
    877   1.48     skrll 	xfer->ux_actlen = 0;
    878   1.48     skrll 	xfer->ux_status = USBD_IN_PROGRESS;
    879   1.12  kiyohara 
    880   1.12  kiyohara 	spipe->xfer = xfer;
    881   1.12  kiyohara 
    882   1.12  kiyohara 	spipe->nerrs = 0;
    883   1.12  kiyohara 	spipe->frame = t->frame;
    884   1.12  kiyohara 	spipe->control = SL11_EPCTRL_ARM_ENABLE;
    885   1.48     skrll 	spipe->tregs[DEV] = pipe->up_dev->ud_addr;
    886   1.36     skrll 	spipe->tregs[PID] = spipe->newpid = UE_GET_ADDR(ed->bEndpointAddress)
    887   1.36     skrll 	    | (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN ? SL11_PID_IN :
    888   1.12  kiyohara 	    SL11_PID_OUT);
    889   1.48     skrll 	spipe->newlen[0] = xfer->ux_length % max_packet;
    890  1.100  riastrad 	spipe->newlen[1] = uimin(xfer->ux_length, max_packet);
    891   1.12  kiyohara 
    892   1.12  kiyohara 	if (spipe->ptype == PT_BULK || spipe->ptype == PT_INTR) {
    893   1.12  kiyohara 		if (spipe->pflags & PF_TOGGLE)
    894   1.12  kiyohara 			spipe->control |= SL11_EPCTRL_DATATOGGLE;
    895   1.12  kiyohara 		spipe->tregs[LEN] = spipe->newlen[1];
    896   1.36     skrll 		if (spipe->tregs[LEN])
    897   1.48     skrll 			spipe->buffer = xfer->ux_buf;
    898   1.12  kiyohara 		else
    899   1.12  kiyohara 			spipe->buffer = NULL;
    900   1.12  kiyohara 		spipe->lastframe = t->frame;
    901   1.94     skrll 		if (spipe->ptype == PT_INTR) {
    902   1.94     skrll 			spipe->frame = spipe->lastframe +
    903   1.94     skrll 			    spipe->pipe.up_interval;
    904   1.94     skrll 		}
    905   1.94     skrll 
    906   1.12  kiyohara #if defined(DEBUG) || defined(SLHCI_DEBUG)
    907   1.36     skrll 		if (__predict_false(spipe->ptype == PT_INTR &&
    908   1.48     skrll 		    xfer->ux_length > spipe->tregs[LEN])) {
    909   1.12  kiyohara 			printf("%s: Long INTR transfer not supported!\n",
    910   1.36     skrll 			    SC_NAME(sc));
    911   1.79     skrll 			DDOLOG("Long INTR transfer not supported!", 0, 0, 0, 0);
    912   1.48     skrll 			xfer->ux_status = USBD_INVAL;
    913   1.12  kiyohara 		}
    914    1.1     isaki #endif
    915   1.12  kiyohara 	} else {
    916   1.12  kiyohara 		/* ptype may be currently set to any control transfer type. */
    917   1.12  kiyohara 		SLHCI_DEXEC(D_TRACE, slhci_log_xfer(xfer));
    918    1.1     isaki 
    919   1.12  kiyohara 		/* SETUP contains IN/OUT bits also */
    920   1.12  kiyohara 		spipe->tregs[PID] |= SL11_PID_SETUP;
    921   1.12  kiyohara 		spipe->tregs[LEN] = 8;
    922   1.48     skrll 		spipe->buffer = (uint8_t *)&xfer->ux_request;
    923   1.12  kiyohara 		DLOGBUF(D_XFER, spipe->buffer, spipe->tregs[LEN]);
    924   1.12  kiyohara 		spipe->ptype = PT_CTRL_SETUP;
    925   1.12  kiyohara 		spipe->newpid &= ~SL11_PID_BITS;
    926   1.89     skrll 		if (xfer->ux_length == 0 ||
    927   1.89     skrll 		    (xfer->ux_request.bmRequestType & UT_READ))
    928   1.12  kiyohara 			spipe->newpid |= SL11_PID_IN;
    929   1.12  kiyohara 		else
    930   1.12  kiyohara 			spipe->newpid |= SL11_PID_OUT;
    931   1.12  kiyohara 	}
    932   1.12  kiyohara 
    933   1.89     skrll 	if (xfer->ux_flags & USBD_FORCE_SHORT_XFER &&
    934   1.89     skrll 	    spipe->tregs[LEN] == max_packet &&
    935   1.89     skrll 	    (spipe->newpid & SL11_PID_BITS) == SL11_PID_OUT)
    936   1.12  kiyohara 		spipe->wantshort = 1;
    937   1.12  kiyohara 	else
    938   1.12  kiyohara 		spipe->wantshort = 0;
    939   1.12  kiyohara 
    940   1.34     skrll 	/*
    941   1.34     skrll 	 * The goal of newbustime and newlen is to avoid bustime calculation
    942   1.37     skrll 	 * in the interrupt.  The calculations are not too complex, but they
    943   1.37     skrll 	 * complicate the conditional logic somewhat and doing them all in the
    944   1.37     skrll 	 * same place shares constants. Index 0 is "short length" for bulk and
    945   1.37     skrll 	 * ctrl data and 1 is "full length" for ctrl data (bulk/intr are
    946   1.34     skrll 	 * already set to full length).
    947   1.34     skrll 	 */
    948   1.12  kiyohara 	if (spipe->pflags & PF_LS) {
    949   1.34     skrll 		/*
    950   1.48     skrll 		 * Setting PREAMBLE for directly connected LS devices will
    951   1.34     skrll 		 * lock up the chip.
    952   1.34     skrll 		 */
    953   1.12  kiyohara 		if (spipe->pflags & PF_PREAMBLE)
    954   1.12  kiyohara 			spipe->control |= SL11_EPCTRL_PREAMBLE;
    955   1.12  kiyohara 		if (max_packet <= 8) {
    956   1.36     skrll 			spipe->bustime = SLHCI_LS_CONST +
    957   1.12  kiyohara 			    SLHCI_LS_DATA_TIME(spipe->tregs[LEN]);
    958   1.36     skrll 			spipe->newbustime[0] = SLHCI_LS_CONST +
    959   1.12  kiyohara 			    SLHCI_LS_DATA_TIME(spipe->newlen[0]);
    960   1.36     skrll 			spipe->newbustime[1] = SLHCI_LS_CONST +
    961   1.12  kiyohara 			    SLHCI_LS_DATA_TIME(spipe->newlen[1]);
    962   1.12  kiyohara 		} else
    963   1.48     skrll 			xfer->ux_status = USBD_INVAL;
    964   1.12  kiyohara 	} else {
    965   1.48     skrll 		UL_SLASSERT(pipe->up_dev->ud_speed == USB_SPEED_FULL, sc,
    966   1.12  kiyohara 		    spipe, xfer, return USBD_IN_PROGRESS);
    967   1.12  kiyohara 		if (max_packet <= SL11_MAX_PACKET_SIZE) {
    968   1.36     skrll 			spipe->bustime = SLHCI_FS_CONST +
    969   1.12  kiyohara 			    SLHCI_FS_DATA_TIME(spipe->tregs[LEN]);
    970   1.36     skrll 			spipe->newbustime[0] = SLHCI_FS_CONST +
    971   1.12  kiyohara 			    SLHCI_FS_DATA_TIME(spipe->newlen[0]);
    972   1.36     skrll 			spipe->newbustime[1] = SLHCI_FS_CONST +
    973   1.12  kiyohara 			    SLHCI_FS_DATA_TIME(spipe->newlen[1]);
    974   1.12  kiyohara 		} else
    975   1.48     skrll 			xfer->ux_status = USBD_INVAL;
    976   1.12  kiyohara 	}
    977   1.12  kiyohara 
    978   1.34     skrll 	/*
    979   1.34     skrll 	 * The datasheet incorrectly indicates that DIRECTION is for
    980   1.37     skrll 	 * "transmit to host".  It is for OUT and SETUP.  The app note
    981   1.34     skrll 	 * describes its use correctly.
    982   1.34     skrll 	 */
    983   1.37     skrll 	if ((spipe->tregs[PID] & SL11_PID_BITS) != SL11_PID_IN)
    984   1.12  kiyohara 		spipe->control |= SL11_EPCTRL_DIRECTION;
    985   1.12  kiyohara 
    986   1.12  kiyohara 	slhci_start_entry(sc, spipe);
    987    1.1     isaki 
    988   1.12  kiyohara 	return USBD_IN_PROGRESS;
    989   1.12  kiyohara }
    990    1.1     isaki 
    991   1.12  kiyohara usbd_status
    992   1.12  kiyohara slhci_root_start(struct usbd_xfer *xfer)
    993   1.12  kiyohara {
    994   1.58     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
    995   1.12  kiyohara 	struct slhci_softc *sc;
    996   1.76    martin 	struct slhci_pipe *spipe __diagused;
    997    1.1     isaki 
    998   1.48     skrll 	spipe = SLHCI_PIPE2SPIPE(xfer->ux_pipe);
    999   1.48     skrll 	sc = SLHCI_XFER2SC(xfer);
   1000    1.1     isaki 
   1001   1.75     skrll 	struct slhci_transfers *t = &sc->sc_transfers;
   1002   1.75     skrll 
   1003   1.75     skrll 	LK_SLASSERT(spipe != NULL && xfer != NULL, sc, spipe, xfer, return
   1004   1.75     skrll 	    USBD_CANCELLED);
   1005   1.75     skrll 
   1006   1.98  pgoyette 	DLOG(D_TRACE, "transfer type %jd start",
   1007   1.98  pgoyette 	    SLHCI_XFER_TYPE(xfer), 0, 0, 0);
   1008   1.75     skrll 
   1009  1.110  riastrad 	KASSERT(sc->sc_bus.ub_usepolling || mutex_owned(&sc->sc_lock));
   1010  1.110  riastrad 
   1011   1.75     skrll 	KASSERT(spipe->ptype == PT_ROOT_INTR);
   1012   1.75     skrll 
   1013  1.103  riastrad 	KASSERT(t->rootintr == NULL);
   1014   1.75     skrll 	t->rootintr = xfer;
   1015  1.103  riastrad 	xfer->ux_status = USBD_IN_PROGRESS;
   1016   1.75     skrll 
   1017   1.75     skrll 	return USBD_IN_PROGRESS;
   1018    1.1     isaki }
   1019    1.1     isaki 
   1020    1.1     isaki usbd_status
   1021   1.12  kiyohara slhci_open(struct usbd_pipe *pipe)
   1022    1.1     isaki {
   1023   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1024   1.12  kiyohara 	struct usbd_device *dev;
   1025   1.12  kiyohara 	struct slhci_softc *sc;
   1026   1.12  kiyohara 	struct slhci_pipe *spipe;
   1027   1.12  kiyohara 	usb_endpoint_descriptor_t *ed;
   1028   1.12  kiyohara 	unsigned int max_packet, pmaxpkt;
   1029   1.48     skrll 	uint8_t rhaddr;
   1030   1.12  kiyohara 
   1031   1.48     skrll 	dev = pipe->up_dev;
   1032   1.48     skrll 	sc = SLHCI_PIPE2SC(pipe);
   1033   1.48     skrll 	spipe = SLHCI_PIPE2SPIPE(pipe);
   1034   1.48     skrll 	ed = pipe->up_endpoint->ue_edesc;
   1035   1.48     skrll 	rhaddr = dev->ud_bus->ub_rhaddr;
   1036   1.12  kiyohara 
   1037   1.98  pgoyette 	DLOG(D_TRACE, "slhci_open(addr=%jd,ep=%jd,rootaddr=%jd)",
   1038   1.48     skrll 		dev->ud_addr, ed->bEndpointAddress, rhaddr, 0);
   1039   1.12  kiyohara 
   1040   1.12  kiyohara 	spipe->pflags = 0;
   1041   1.12  kiyohara 	spipe->frame = 0;
   1042   1.12  kiyohara 	spipe->lastframe = 0;
   1043   1.12  kiyohara 	spipe->xfer = NULL;
   1044   1.12  kiyohara 	spipe->buffer = NULL;
   1045   1.12  kiyohara 
   1046   1.12  kiyohara 	gcq_init(&spipe->ap);
   1047   1.12  kiyohara 	gcq_init(&spipe->to);
   1048   1.12  kiyohara 	gcq_init(&spipe->xq);
   1049   1.12  kiyohara 
   1050   1.34     skrll 	/*
   1051   1.34     skrll 	 * The endpoint descriptor will not have been set up yet in the case
   1052   1.37     skrll 	 * of the standard control pipe, so the max packet checks are also
   1053   1.34     skrll 	 * necessary in start.
   1054   1.34     skrll 	 */
   1055   1.12  kiyohara 
   1056   1.12  kiyohara 	max_packet = UGETW(ed->wMaxPacketSize);
   1057   1.12  kiyohara 
   1058   1.48     skrll 	if (dev->ud_speed == USB_SPEED_LOW) {
   1059   1.12  kiyohara 		spipe->pflags |= PF_LS;
   1060   1.48     skrll 		if (dev->ud_myhub->ud_addr != rhaddr) {
   1061   1.12  kiyohara 			spipe->pflags |= PF_PREAMBLE;
   1062   1.12  kiyohara 			if (!slhci_try_lsvh)
   1063   1.36     skrll 				return slhci_lock_call(sc, &slhci_lsvh_warn,
   1064   1.12  kiyohara 				    spipe, NULL);
   1065   1.12  kiyohara 		}
   1066   1.12  kiyohara 		pmaxpkt = 8;
   1067   1.12  kiyohara 	} else
   1068   1.12  kiyohara 		pmaxpkt = SL11_MAX_PACKET_SIZE;
   1069   1.12  kiyohara 
   1070   1.12  kiyohara 	if (max_packet > pmaxpkt) {
   1071   1.98  pgoyette 		DLOG(D_ERR, "packet too large! size %jd spipe %#jx", max_packet,
   1072   1.98  pgoyette 		    (uintptr_t)spipe, 0,0);
   1073   1.12  kiyohara 		return USBD_INVAL;
   1074   1.12  kiyohara 	}
   1075    1.1     isaki 
   1076   1.48     skrll 	if (dev->ud_addr == rhaddr) {
   1077    1.1     isaki 		switch (ed->bEndpointAddress) {
   1078    1.1     isaki 		case USB_CONTROL_ENDPOINT:
   1079   1.12  kiyohara 			spipe->ptype = PT_ROOT_CTRL;
   1080   1.48     skrll 			pipe->up_interval = 0;
   1081   1.48     skrll 			pipe->up_methods = &roothub_ctrl_methods;
   1082    1.1     isaki 			break;
   1083   1.48     skrll 		case UE_DIR_IN | USBROOTHUB_INTR_ENDPT:
   1084   1.12  kiyohara 			spipe->ptype = PT_ROOT_INTR;
   1085   1.48     skrll 			pipe->up_interval = 1;
   1086   1.48     skrll 			pipe->up_methods = &slhci_root_methods;
   1087    1.1     isaki 			break;
   1088    1.1     isaki 		default:
   1089   1.12  kiyohara 			printf("%s: Invalid root endpoint!\n", SC_NAME(sc));
   1090   1.79     skrll 			DDOLOG("Invalid root endpoint", 0, 0, 0, 0);
   1091    1.1     isaki 			return USBD_INVAL;
   1092    1.1     isaki 		}
   1093   1.12  kiyohara 		return USBD_NORMAL_COMPLETION;
   1094    1.1     isaki 	} else {
   1095    1.1     isaki 		switch (ed->bmAttributes & UE_XFERTYPE) {
   1096    1.1     isaki 		case UE_CONTROL:
   1097   1.12  kiyohara 			spipe->ptype = PT_CTRL_SETUP;
   1098   1.48     skrll 			pipe->up_interval = 0;
   1099    1.1     isaki 			break;
   1100    1.1     isaki 		case UE_INTERRUPT:
   1101   1.12  kiyohara 			spipe->ptype = PT_INTR;
   1102   1.48     skrll 			if (pipe->up_interval == USBD_DEFAULT_INTERVAL)
   1103   1.48     skrll 				pipe->up_interval = ed->bInterval;
   1104    1.1     isaki 			break;
   1105    1.1     isaki 		case UE_ISOCHRONOUS:
   1106   1.36     skrll 			return slhci_lock_call(sc, &slhci_isoc_warn, spipe,
   1107   1.12  kiyohara 			    NULL);
   1108    1.1     isaki 		case UE_BULK:
   1109   1.12  kiyohara 			spipe->ptype = PT_BULK;
   1110   1.48     skrll 			pipe->up_interval = 0;
   1111    1.1     isaki 			break;
   1112    1.1     isaki 		}
   1113   1.12  kiyohara 
   1114   1.98  pgoyette 		DLOG(D_MSG, "open pipe type %jd interval %jd", spipe->ptype,
   1115   1.48     skrll 		    pipe->up_interval, 0,0);
   1116   1.12  kiyohara 
   1117   1.48     skrll 		pipe->up_methods = __UNCONST(&slhci_pipe_methods);
   1118   1.12  kiyohara 
   1119   1.12  kiyohara 		return slhci_lock_call(sc, &slhci_open_pipe, spipe, NULL);
   1120    1.1     isaki 	}
   1121    1.1     isaki }
   1122    1.1     isaki 
   1123   1.12  kiyohara int
   1124   1.12  kiyohara slhci_supported_rev(uint8_t rev)
   1125    1.1     isaki {
   1126   1.48     skrll 	return rev >= SLTYPE_SL811HS_R12 && rev <= SLTYPE_SL811HS_R15;
   1127    1.1     isaki }
   1128    1.1     isaki 
   1129   1.34     skrll /*
   1130   1.34     skrll  * Must be called before the ISR is registered. Interrupts can be shared so
   1131   1.37     skrll  * slhci_intr could be called as soon as the ISR is registered.
   1132   1.34     skrll  * Note max_current argument is actual current, but stored as current/2
   1133   1.34     skrll  */
   1134    1.1     isaki void
   1135   1.36     skrll slhci_preinit(struct slhci_softc *sc, PowerFunc pow, bus_space_tag_t iot,
   1136   1.29  kiyohara     bus_space_handle_t ioh, uint16_t max_current, uint32_t stride)
   1137    1.1     isaki {
   1138   1.12  kiyohara 	struct slhci_transfers *t;
   1139   1.12  kiyohara 	int i;
   1140   1.12  kiyohara 
   1141   1.12  kiyohara 	t = &sc->sc_transfers;
   1142   1.12  kiyohara 
   1143   1.83     skrll #ifdef SLHCI_DEBUG
   1144   1.83     skrll 	ssc = sc;
   1145   1.83     skrll #endif
   1146   1.83     skrll 
   1147   1.41     skrll 	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
   1148   1.57     skrll 	mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_USB);
   1149   1.41     skrll 
   1150   1.12  kiyohara 	/* sc->sc_ier = 0;	*/
   1151   1.12  kiyohara 	/* t->rootintr = NULL;	*/
   1152   1.12  kiyohara 	t->flags = F_NODEV|F_UDISABLED;
   1153   1.12  kiyohara 	t->pend = INT_MAX;
   1154   1.12  kiyohara 	KASSERT(slhci_wait_time != INT_MAX);
   1155   1.12  kiyohara 	t->len[0] = t->len[1] = -1;
   1156   1.12  kiyohara 	if (max_current > 500)
   1157   1.12  kiyohara 		max_current = 500;
   1158   1.12  kiyohara 	t->max_current = (uint8_t)(max_current / 2);
   1159   1.12  kiyohara 	sc->sc_enable_power = pow;
   1160   1.12  kiyohara 	sc->sc_iot = iot;
   1161   1.12  kiyohara 	sc->sc_ioh = ioh;
   1162   1.12  kiyohara 	sc->sc_stride = stride;
   1163   1.12  kiyohara 
   1164   1.12  kiyohara 	KASSERT(Q_MAX+1 == sizeof(t->q) / sizeof(t->q[0]));
   1165   1.12  kiyohara 
   1166   1.12  kiyohara 	for (i = 0; i <= Q_MAX; i++)
   1167   1.12  kiyohara 		gcq_init_head(&t->q[i]);
   1168   1.12  kiyohara 	gcq_init_head(&t->timed);
   1169   1.12  kiyohara 	gcq_init_head(&t->to);
   1170   1.12  kiyohara 	gcq_init_head(&t->ap);
   1171   1.12  kiyohara 	gcq_init_head(&sc->sc_waitq);
   1172    1.1     isaki }
   1173    1.1     isaki 
   1174   1.12  kiyohara int
   1175   1.12  kiyohara slhci_attach(struct slhci_softc *sc)
   1176    1.1     isaki {
   1177   1.41     skrll 	struct slhci_transfers *t;
   1178   1.41     skrll 	const char *rev;
   1179   1.41     skrll 
   1180   1.41     skrll 	t = &sc->sc_transfers;
   1181   1.41     skrll 
   1182   1.41     skrll 	/* Detect and check the controller type */
   1183   1.41     skrll 	t->sltype = SL11_GET_REV(slhci_read(sc, SL11_REV));
   1184   1.41     skrll 
   1185   1.41     skrll 	/* SL11H not supported */
   1186   1.41     skrll 	if (!slhci_supported_rev(t->sltype)) {
   1187   1.41     skrll 		if (t->sltype == SLTYPE_SL11H)
   1188   1.41     skrll 			printf("%s: SL11H unsupported or bus error!\n",
   1189   1.41     skrll 			    SC_NAME(sc));
   1190   1.41     skrll 		else
   1191   1.41     skrll 			printf("%s: Unknown chip revision!\n", SC_NAME(sc));
   1192   1.12  kiyohara 		return -1;
   1193   1.41     skrll 	}
   1194   1.41     skrll 
   1195   1.86     skrll #ifdef SLHCI_DEBUG
   1196   1.86     skrll 	if (slhci_memtest(sc)) {
   1197   1.86     skrll 		printf("%s: memory/bus error!\n", SC_NAME(sc));
   1198   1.86     skrll 		return -1;
   1199   1.86     skrll 	}
   1200   1.86     skrll #endif
   1201   1.86     skrll 
   1202   1.41     skrll 	callout_init(&sc->sc_timer, CALLOUT_MPSAFE);
   1203   1.41     skrll 	callout_setfunc(&sc->sc_timer, slhci_reset_entry, sc);
   1204   1.41     skrll 
   1205   1.41     skrll 	/*
   1206   1.41     skrll 	 * It is not safe to call the soft interrupt directly as
   1207   1.48     skrll 	 * usb_schedsoftintr does in the ub_usepolling case (due to locking).
   1208   1.41     skrll 	 */
   1209   1.41     skrll 	sc->sc_cb_softintr = softint_establish(SOFTINT_NET,
   1210   1.41     skrll 	    slhci_callback_entry, sc);
   1211   1.41     skrll 
   1212   1.41     skrll 	if (t->sltype == SLTYPE_SL811HS_R12)
   1213   1.54     skrll 		rev = "(rev 1.2)";
   1214   1.41     skrll 	else if (t->sltype == SLTYPE_SL811HS_R14)
   1215   1.54     skrll 		rev = "(rev 1.4 or 1.5)";
   1216   1.41     skrll 	else
   1217   1.54     skrll 		rev = "(unknown revision)";
   1218   1.41     skrll 
   1219   1.41     skrll 	aprint_normal("%s: ScanLogic SL811HS/T USB Host Controller %s\n",
   1220   1.41     skrll 	    SC_NAME(sc), rev);
   1221   1.41     skrll 
   1222   1.41     skrll 	aprint_normal("%s: Max Current %u mA (value by code, not by probe)\n",
   1223   1.41     skrll 	    SC_NAME(sc), t->max_current * 2);
   1224   1.41     skrll 
   1225   1.41     skrll #if defined(SLHCI_DEBUG) || defined(SLHCI_NO_OVERTIME) || \
   1226   1.41     skrll     defined(SLHCI_TRY_LSVH) || defined(SLHCI_PROFILE_TRANSFER)
   1227   1.41     skrll 	aprint_normal("%s: driver options:"
   1228   1.41     skrll #ifdef SLHCI_DEBUG
   1229   1.41     skrll 	" SLHCI_DEBUG"
   1230   1.41     skrll #endif
   1231   1.41     skrll #ifdef SLHCI_TRY_LSVH
   1232   1.41     skrll 	" SLHCI_TRY_LSVH"
   1233   1.41     skrll #endif
   1234   1.41     skrll #ifdef SLHCI_NO_OVERTIME
   1235   1.41     skrll 	" SLHCI_NO_OVERTIME"
   1236   1.41     skrll #endif
   1237   1.41     skrll #ifdef SLHCI_PROFILE_TRANSFER
   1238   1.41     skrll 	" SLHCI_PROFILE_TRANSFER"
   1239   1.41     skrll #endif
   1240   1.41     skrll 	"\n", SC_NAME(sc));
   1241   1.41     skrll #endif
   1242   1.48     skrll 	sc->sc_bus.ub_revision = USBREV_1_1;
   1243   1.48     skrll 	sc->sc_bus.ub_methods = __UNCONST(&slhci_bus_methods);
   1244   1.48     skrll 	sc->sc_bus.ub_pipesize = sizeof(struct slhci_pipe);
   1245   1.48     skrll 	sc->sc_bus.ub_usedma = false;
   1246   1.41     skrll 
   1247   1.41     skrll 	if (!sc->sc_enable_power)
   1248   1.41     skrll 		t->flags |= F_REALPOWER;
   1249   1.41     skrll 
   1250   1.41     skrll 	t->flags |= F_ACTIVE;
   1251    1.1     isaki 
   1252   1.12  kiyohara 	/* Attach usb and uhub. */
   1253  1.105   thorpej 	sc->sc_child = config_found(SC_DEV(sc), &sc->sc_bus, usbctlprint,
   1254  1.106   thorpej 	    CFARGS_NONE);
   1255    1.1     isaki 
   1256   1.12  kiyohara 	if (!sc->sc_child)
   1257   1.12  kiyohara 		return -1;
   1258   1.12  kiyohara 	else
   1259   1.12  kiyohara 		return 0;
   1260    1.1     isaki }
   1261    1.1     isaki 
   1262   1.12  kiyohara int
   1263   1.12  kiyohara slhci_detach(struct slhci_softc *sc, int flags)
   1264    1.1     isaki {
   1265   1.12  kiyohara 	struct slhci_transfers *t;
   1266   1.12  kiyohara 	int ret;
   1267    1.1     isaki 
   1268   1.12  kiyohara 	t = &sc->sc_transfers;
   1269   1.12  kiyohara 
   1270   1.12  kiyohara 	/* By this point bus access is no longer allowed. */
   1271   1.12  kiyohara 
   1272   1.12  kiyohara 	KASSERT(!(t->flags & F_ACTIVE));
   1273   1.12  kiyohara 
   1274   1.34     skrll 	/*
   1275   1.34     skrll 	 * To be MPSAFE is not sufficient to cancel callouts and soft
   1276   1.13  kiyohara 	 * interrupts and assume they are dead since the code could already be
   1277   1.34     skrll 	 * running or about to run.  Wait until they are known to be done.
   1278   1.34     skrll 	 */
   1279   1.12  kiyohara 	while (t->flags & (F_RESET|F_CALLBACK))
   1280   1.12  kiyohara 		tsleep(&sc, PPAUSE, "slhci_detach", hz);
   1281   1.12  kiyohara 
   1282   1.16        ad 	softint_disestablish(sc->sc_cb_softintr);
   1283   1.12  kiyohara 
   1284   1.41     skrll 	mutex_destroy(&sc->sc_lock);
   1285   1.41     skrll 	mutex_destroy(&sc->sc_intr_lock);
   1286   1.41     skrll 
   1287   1.12  kiyohara 	ret = 0;
   1288   1.12  kiyohara 
   1289   1.12  kiyohara 	if (sc->sc_child)
   1290   1.12  kiyohara 		ret = config_detach(sc->sc_child, flags);
   1291   1.12  kiyohara 
   1292   1.12  kiyohara #ifdef SLHCI_MEM_ACCOUNTING
   1293   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1294   1.12  kiyohara 	if (sc->sc_mem_use) {
   1295   1.12  kiyohara 		printf("%s: Memory still in use after detach! mem_use (count)"
   1296   1.12  kiyohara 		    " = %d\n", SC_NAME(sc), sc->sc_mem_use);
   1297   1.79     skrll 		DDOLOG("Memory still in use after detach! mem_use (count)"
   1298   1.79     skrll 		    " = %d", sc->sc_mem_use, 0, 0, 0);
   1299   1.12  kiyohara 	}
   1300   1.12  kiyohara #endif
   1301   1.12  kiyohara 
   1302   1.12  kiyohara 	return ret;
   1303   1.12  kiyohara }
   1304   1.12  kiyohara 
   1305   1.12  kiyohara int
   1306   1.23    cegger slhci_activate(device_t self, enum devact act)
   1307   1.12  kiyohara {
   1308   1.24    dyoung 	struct slhci_softc *sc = device_private(self);
   1309   1.12  kiyohara 
   1310   1.24    dyoung 	switch (act) {
   1311   1.24    dyoung 	case DVACT_DEACTIVATE:
   1312   1.24    dyoung 		slhci_lock_call(sc, &slhci_halt, NULL, NULL);
   1313   1.24    dyoung 		return 0;
   1314   1.24    dyoung 	default:
   1315   1.12  kiyohara 		return EOPNOTSUPP;
   1316   1.24    dyoung 	}
   1317   1.12  kiyohara }
   1318    1.1     isaki 
   1319    1.1     isaki void
   1320   1.12  kiyohara slhci_abort(struct usbd_xfer *xfer)
   1321    1.1     isaki {
   1322   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1323   1.12  kiyohara 	struct slhci_softc *sc;
   1324   1.12  kiyohara 	struct slhci_pipe *spipe;
   1325   1.12  kiyohara 
   1326   1.48     skrll 	spipe = SLHCI_PIPE2SPIPE(xfer->ux_pipe);
   1327   1.12  kiyohara 
   1328   1.12  kiyohara 	if (spipe == NULL)
   1329   1.12  kiyohara 		goto callback;
   1330   1.12  kiyohara 
   1331   1.48     skrll 	sc = SLHCI_XFER2SC(xfer);
   1332   1.46     joerg 	KASSERT(mutex_owned(&sc->sc_lock));
   1333   1.46     joerg 
   1334   1.98  pgoyette 	DLOG(D_TRACE, "transfer type %jd abort xfer %#jx spipe %#jx "
   1335   1.98  pgoyette 	    " spipe->xfer %#jx", spipe->ptype, (uintptr_t)xfer,
   1336   1.98  pgoyette 	    (uintptr_t)spipe, (uintptr_t)spipe->xfer);
   1337   1.12  kiyohara 
   1338   1.12  kiyohara 	slhci_lock_call(sc, &slhci_do_abort, spipe, xfer);
   1339    1.1     isaki 
   1340   1.12  kiyohara callback:
   1341   1.48     skrll 	xfer->ux_status = USBD_CANCELLED;
   1342   1.12  kiyohara 	usb_transfer_complete(xfer);
   1343    1.1     isaki }
   1344    1.1     isaki 
   1345   1.12  kiyohara void
   1346   1.12  kiyohara slhci_close(struct usbd_pipe *pipe)
   1347    1.1     isaki {
   1348   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1349   1.12  kiyohara 	struct slhci_softc *sc;
   1350   1.12  kiyohara 	struct slhci_pipe *spipe;
   1351    1.1     isaki 
   1352   1.48     skrll 	sc = SLHCI_PIPE2SC(pipe);
   1353   1.48     skrll 	spipe = SLHCI_PIPE2SPIPE(pipe);
   1354    1.1     isaki 
   1355   1.98  pgoyette 	DLOG(D_TRACE, "transfer type %jd close spipe %#jx spipe->xfer %#jx",
   1356   1.98  pgoyette 	    spipe->ptype, (uintptr_t)spipe, (uintptr_t)spipe->xfer, 0);
   1357    1.1     isaki 
   1358   1.12  kiyohara 	slhci_lock_call(sc, &slhci_close_pipe, spipe, NULL);
   1359    1.1     isaki }
   1360    1.1     isaki 
   1361    1.1     isaki void
   1362   1.12  kiyohara slhci_clear_toggle(struct usbd_pipe *pipe)
   1363    1.1     isaki {
   1364   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1365   1.12  kiyohara 	struct slhci_pipe *spipe;
   1366   1.12  kiyohara 
   1367   1.48     skrll 	spipe = SLHCI_PIPE2SPIPE(pipe);
   1368   1.12  kiyohara 
   1369   1.98  pgoyette 	DLOG(D_TRACE, "transfer type %jd toggle spipe %#jx", spipe->ptype,
   1370   1.98  pgoyette 	    (uintptr_t)spipe, 0, 0);
   1371    1.1     isaki 
   1372   1.12  kiyohara 	spipe->pflags &= ~PF_TOGGLE;
   1373    1.2     isaki 
   1374    1.2     isaki #ifdef DIAGNOSTIC
   1375   1.12  kiyohara 	if (spipe->xfer != NULL) {
   1376   1.36     skrll 		struct slhci_softc *sc = (struct slhci_softc
   1377   1.48     skrll 		    *)pipe->up_dev->ud_bus;
   1378   1.12  kiyohara 
   1379   1.36     skrll 		printf("%s: Clear toggle on transfer in progress! halted\n",
   1380   1.12  kiyohara 		    SC_NAME(sc));
   1381   1.79     skrll 		DDOLOG("Clear toggle on transfer in progress! halted",
   1382   1.79     skrll 		    0, 0, 0, 0);
   1383   1.12  kiyohara 		slhci_halt(sc, NULL, NULL);
   1384    1.2     isaki 	}
   1385    1.2     isaki #endif
   1386    1.1     isaki }
   1387    1.1     isaki 
   1388    1.1     isaki void
   1389   1.12  kiyohara slhci_poll(struct usbd_bus *bus) /* XXX necessary? */
   1390    1.1     isaki {
   1391   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1392   1.12  kiyohara 	struct slhci_softc *sc;
   1393   1.12  kiyohara 
   1394   1.48     skrll 	sc = SLHCI_BUS2SC(bus);
   1395   1.12  kiyohara 
   1396   1.12  kiyohara 	DLOG(D_TRACE, "slhci_poll", 0,0,0,0);
   1397   1.12  kiyohara 
   1398   1.12  kiyohara 	slhci_lock_call(sc, &slhci_do_poll, NULL, NULL);
   1399    1.1     isaki }
   1400    1.1     isaki 
   1401   1.12  kiyohara void
   1402   1.12  kiyohara slhci_done(struct usbd_xfer *xfer)
   1403   1.12  kiyohara {
   1404   1.12  kiyohara }
   1405    1.1     isaki 
   1406   1.12  kiyohara void
   1407   1.12  kiyohara slhci_void(void *v) {}
   1408    1.1     isaki 
   1409   1.12  kiyohara /* End out of lock functions. Start lock entry functions. */
   1410    1.1     isaki 
   1411   1.12  kiyohara #ifdef SLHCI_MEM_ACCOUNTING
   1412   1.12  kiyohara void
   1413   1.12  kiyohara slhci_mem_use(struct usbd_bus *bus, int val)
   1414   1.12  kiyohara {
   1415   1.48     skrll 	struct slhci_softc *sc = SLHCI_BUS2SC(bus);
   1416    1.1     isaki 
   1417   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1418   1.12  kiyohara 	sc->sc_mem_use += val;
   1419   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1420   1.12  kiyohara }
   1421   1.12  kiyohara #endif
   1422    1.1     isaki 
   1423   1.12  kiyohara void
   1424   1.12  kiyohara slhci_reset_entry(void *arg)
   1425    1.1     isaki {
   1426   1.59     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1427   1.41     skrll 	struct slhci_softc *sc = arg;
   1428   1.12  kiyohara 
   1429   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1430   1.12  kiyohara 	slhci_reset(sc);
   1431   1.34     skrll 	/*
   1432   1.39     skrll 	 * We cannot call the callback directly since we could then be reset
   1433   1.37     skrll 	 * again before finishing and need the callout delay for timing.
   1434   1.37     skrll 	 * Scheduling the callout again before we exit would defeat the reap
   1435   1.37     skrll 	 * mechanism since we could be unlocked while the reset flag is not
   1436   1.34     skrll 	 * set. The callback code will check the wait queue.
   1437   1.34     skrll 	 */
   1438   1.12  kiyohara 	slhci_callback_schedule(sc);
   1439   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1440    1.1     isaki }
   1441    1.1     isaki 
   1442    1.1     isaki usbd_status
   1443   1.36     skrll slhci_lock_call(struct slhci_softc *sc, LockCallFunc lcf, struct slhci_pipe
   1444   1.12  kiyohara     *spipe, struct usbd_xfer *xfer)
   1445   1.12  kiyohara {
   1446   1.12  kiyohara 	usbd_status ret;
   1447   1.12  kiyohara 
   1448   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1449   1.12  kiyohara 	ret = (*lcf)(sc, spipe, xfer);
   1450   1.41     skrll 	slhci_main(sc);
   1451   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1452   1.12  kiyohara 
   1453   1.12  kiyohara 	return ret;
   1454   1.12  kiyohara }
   1455   1.12  kiyohara 
   1456   1.12  kiyohara void
   1457   1.12  kiyohara slhci_start_entry(struct slhci_softc *sc, struct slhci_pipe *spipe)
   1458    1.1     isaki {
   1459   1.12  kiyohara 	struct slhci_transfers *t;
   1460    1.1     isaki 
   1461   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1462   1.12  kiyohara 	t = &sc->sc_transfers;
   1463    1.1     isaki 
   1464   1.41     skrll 	if (!(t->flags & (F_AINPROG|F_BINPROG))) {
   1465   1.12  kiyohara 		slhci_enter_xfer(sc, spipe);
   1466   1.12  kiyohara 		slhci_dotransfer(sc);
   1467   1.41     skrll 		slhci_main(sc);
   1468   1.12  kiyohara 	} else {
   1469   1.12  kiyohara 		enter_waitq(sc, spipe);
   1470    1.1     isaki 	}
   1471   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1472    1.1     isaki }
   1473    1.1     isaki 
   1474   1.12  kiyohara void
   1475   1.12  kiyohara slhci_callback_entry(void *arg)
   1476    1.1     isaki {
   1477   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1478   1.12  kiyohara 	struct slhci_softc *sc;
   1479   1.12  kiyohara 	struct slhci_transfers *t;
   1480    1.1     isaki 
   1481   1.41     skrll 	sc = (struct slhci_softc *)arg;
   1482    1.1     isaki 
   1483   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1484   1.12  kiyohara 	t = &sc->sc_transfers;
   1485   1.98  pgoyette 	DLOG(D_SOFT, "callback_entry flags %#jx", t->flags, 0,0,0);
   1486    1.1     isaki 
   1487   1.12  kiyohara repeat:
   1488   1.41     skrll 	slhci_callback(sc);
   1489    1.1     isaki 
   1490   1.12  kiyohara 	if (!gcq_empty(&sc->sc_waitq)) {
   1491   1.12  kiyohara 		slhci_enter_xfers(sc);
   1492   1.12  kiyohara 		slhci_dotransfer(sc);
   1493   1.12  kiyohara 		slhci_waitintr(sc, 0);
   1494   1.12  kiyohara 		goto repeat;
   1495   1.12  kiyohara 	}
   1496    1.1     isaki 
   1497   1.12  kiyohara 	t->flags &= ~F_CALLBACK;
   1498   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1499    1.1     isaki }
   1500    1.1     isaki 
   1501    1.1     isaki void
   1502   1.41     skrll slhci_do_callback(struct slhci_softc *sc, struct usbd_xfer *xfer)
   1503    1.1     isaki {
   1504   1.62     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1505   1.43     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   1506   1.12  kiyohara 
   1507   1.12  kiyohara 	start_cc_time(&t_callback, (u_int)xfer);
   1508   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1509   1.12  kiyohara 
   1510   1.41     skrll 	mutex_enter(&sc->sc_lock);
   1511   1.12  kiyohara 	usb_transfer_complete(xfer);
   1512   1.41     skrll 	mutex_exit(&sc->sc_lock);
   1513   1.12  kiyohara 
   1514   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1515   1.12  kiyohara 	stop_cc_time(&t_callback);
   1516    1.1     isaki }
   1517    1.1     isaki 
   1518   1.12  kiyohara int
   1519   1.12  kiyohara slhci_intr(void *arg)
   1520    1.1     isaki {
   1521   1.58     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1522   1.41     skrll 	struct slhci_softc *sc = arg;
   1523   1.93     skrll 	int ret = 0;
   1524   1.93     skrll 	int irq;
   1525   1.12  kiyohara 
   1526   1.12  kiyohara 	start_cc_time(&t_hard_int, (unsigned int)arg);
   1527   1.41     skrll 	mutex_enter(&sc->sc_intr_lock);
   1528   1.12  kiyohara 
   1529   1.93     skrll 	do {
   1530   1.93     skrll 		irq = slhci_dointr(sc);
   1531   1.93     skrll 		ret |= irq;
   1532   1.93     skrll 		slhci_main(sc);
   1533   1.93     skrll 	} while (irq);
   1534   1.41     skrll 	mutex_exit(&sc->sc_intr_lock);
   1535   1.12  kiyohara 
   1536   1.12  kiyohara 	stop_cc_time(&t_hard_int);
   1537   1.12  kiyohara 	return ret;
   1538    1.1     isaki }
   1539    1.1     isaki 
   1540   1.85     skrll /* called with interrupt lock only held. */
   1541    1.1     isaki void
   1542   1.41     skrll slhci_main(struct slhci_softc *sc)
   1543    1.1     isaki {
   1544   1.58     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1545   1.12  kiyohara 	struct slhci_transfers *t;
   1546   1.12  kiyohara 
   1547   1.12  kiyohara 	t = &sc->sc_transfers;
   1548    1.1     isaki 
   1549   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   1550    1.1     isaki 
   1551   1.12  kiyohara waitcheck:
   1552   1.12  kiyohara 	slhci_waitintr(sc, slhci_wait_time);
   1553    1.1     isaki 
   1554    1.1     isaki 	/*
   1555   1.48     skrll 	 * The direct call is needed in the ub_usepolling and disabled cases
   1556   1.36     skrll 	 * since the soft interrupt is not available.  In the disabled case,
   1557   1.36     skrll 	 * this code can be reached from the usb detach, after the reaping of
   1558   1.41     skrll 	 * the soft interrupt.  That test could be !F_ACTIVE, but there is no
   1559   1.41     skrll 	 * reason not to make the callbacks directly in the other DISABLED
   1560   1.41     skrll 	 * cases.
   1561    1.1     isaki 	 */
   1562   1.12  kiyohara 	if ((t->flags & F_ROOTINTR) || !gcq_empty(&t->q[Q_CALLBACKS])) {
   1563   1.48     skrll 		if (__predict_false(sc->sc_bus.ub_usepolling ||
   1564   1.41     skrll 		    t->flags & F_DISABLED))
   1565   1.41     skrll 			slhci_callback(sc);
   1566   1.12  kiyohara 		else
   1567   1.12  kiyohara 			slhci_callback_schedule(sc);
   1568   1.12  kiyohara 	}
   1569   1.12  kiyohara 
   1570   1.12  kiyohara 	if (!gcq_empty(&sc->sc_waitq)) {
   1571   1.12  kiyohara 		slhci_enter_xfers(sc);
   1572   1.12  kiyohara 		slhci_dotransfer(sc);
   1573   1.12  kiyohara 		goto waitcheck;
   1574   1.12  kiyohara 	}
   1575   1.79     skrll 	DLOG(D_INTR, "... done", 0, 0, 0, 0);
   1576    1.1     isaki }
   1577    1.1     isaki 
   1578   1.12  kiyohara /* End lock entry functions. Start in lock function. */
   1579   1.12  kiyohara 
   1580   1.12  kiyohara /* Register read/write routines and barriers. */
   1581   1.12  kiyohara #ifdef SLHCI_BUS_SPACE_BARRIERS
   1582   1.12  kiyohara #define BSB(a, b, c, d, e) bus_space_barrier(a, b, c, d, BUS_SPACE_BARRIER_ # e)
   1583   1.95  jdolecek #define BSB_SYNC(a, b, c, d) bus_space_barrier(a, b, c, d, BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE)
   1584   1.12  kiyohara #else /* now !SLHCI_BUS_SPACE_BARRIERS */
   1585   1.47  christos #define BSB(a, b, c, d, e) __USE(d)
   1586   1.12  kiyohara #define BSB_SYNC(a, b, c, d)
   1587   1.12  kiyohara #endif /* SLHCI_BUS_SPACE_BARRIERS */
   1588   1.12  kiyohara 
   1589   1.12  kiyohara static void
   1590   1.12  kiyohara slhci_write(struct slhci_softc *sc, uint8_t addr, uint8_t data)
   1591    1.1     isaki {
   1592   1.12  kiyohara 	bus_size_t paddr, pdata, pst, psz;
   1593   1.12  kiyohara 	bus_space_tag_t iot;
   1594   1.12  kiyohara 	bus_space_handle_t ioh;
   1595   1.12  kiyohara 
   1596   1.12  kiyohara 	paddr = pst = 0;
   1597   1.12  kiyohara 	pdata = sc->sc_stride;
   1598   1.12  kiyohara 	psz = pdata * 2;
   1599   1.12  kiyohara 	iot = sc->sc_iot;
   1600   1.12  kiyohara 	ioh = sc->sc_ioh;
   1601   1.12  kiyohara 
   1602   1.12  kiyohara 	bus_space_write_1(iot, ioh, paddr, addr);
   1603   1.12  kiyohara 	BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
   1604   1.12  kiyohara 	bus_space_write_1(iot, ioh, pdata, data);
   1605   1.12  kiyohara 	BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
   1606   1.12  kiyohara }
   1607   1.12  kiyohara 
   1608   1.12  kiyohara static uint8_t
   1609   1.12  kiyohara slhci_read(struct slhci_softc *sc, uint8_t addr)
   1610   1.12  kiyohara {
   1611   1.12  kiyohara 	bus_size_t paddr, pdata, pst, psz;
   1612   1.12  kiyohara 	bus_space_tag_t iot;
   1613   1.12  kiyohara 	bus_space_handle_t ioh;
   1614   1.12  kiyohara 	uint8_t data;
   1615   1.12  kiyohara 
   1616   1.12  kiyohara 	paddr = pst = 0;
   1617   1.12  kiyohara 	pdata = sc->sc_stride;
   1618   1.12  kiyohara 	psz = pdata * 2;
   1619   1.12  kiyohara 	iot = sc->sc_iot;
   1620   1.12  kiyohara 	ioh = sc->sc_ioh;
   1621   1.12  kiyohara 
   1622   1.12  kiyohara 	bus_space_write_1(iot, ioh, paddr, addr);
   1623   1.12  kiyohara 	BSB(iot, ioh, pst, psz, WRITE_BEFORE_READ);
   1624   1.12  kiyohara 	data = bus_space_read_1(iot, ioh, pdata);
   1625   1.12  kiyohara 	BSB(iot, ioh, pst, psz, READ_BEFORE_WRITE);
   1626   1.12  kiyohara 	return data;
   1627   1.12  kiyohara }
   1628    1.1     isaki 
   1629   1.12  kiyohara #if 0 /* auto-increment mode broken, see errata doc */
   1630   1.12  kiyohara static void
   1631   1.12  kiyohara slhci_write_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
   1632   1.12  kiyohara {
   1633   1.12  kiyohara 	bus_size_t paddr, pdata, pst, psz;
   1634   1.12  kiyohara 	bus_space_tag_t iot;
   1635   1.12  kiyohara 	bus_space_handle_t ioh;
   1636   1.12  kiyohara 
   1637   1.12  kiyohara 	paddr = pst = 0;
   1638   1.12  kiyohara 	pdata = sc->sc_stride;
   1639   1.12  kiyohara 	psz = pdata * 2;
   1640   1.12  kiyohara 	iot = sc->sc_iot;
   1641   1.12  kiyohara 	ioh = sc->sc_ioh;
   1642   1.12  kiyohara 
   1643   1.12  kiyohara 	bus_space_write_1(iot, ioh, paddr, addr);
   1644   1.12  kiyohara 	BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
   1645   1.12  kiyohara 	bus_space_write_multi_1(iot, ioh, pdata, buf, l);
   1646   1.12  kiyohara 	BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
   1647   1.12  kiyohara }
   1648    1.1     isaki 
   1649   1.12  kiyohara static void
   1650   1.12  kiyohara slhci_read_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
   1651   1.12  kiyohara {
   1652   1.12  kiyohara 	bus_size_t paddr, pdata, pst, psz;
   1653   1.12  kiyohara 	bus_space_tag_t iot;
   1654   1.12  kiyohara 	bus_space_handle_t ioh;
   1655   1.12  kiyohara 
   1656   1.12  kiyohara 	paddr = pst = 0;
   1657   1.12  kiyohara 	pdata = sc->sc_stride;
   1658   1.12  kiyohara 	psz = pdata * 2;
   1659   1.12  kiyohara 	iot = sc->sc_iot;
   1660   1.12  kiyohara 	ioh = sc->sc_ioh;
   1661   1.12  kiyohara 
   1662   1.12  kiyohara 	bus_space_write_1(iot, ioh, paddr, addr);
   1663   1.12  kiyohara 	BSB(iot, ioh, pst, psz, WRITE_BEFORE_READ);
   1664   1.12  kiyohara 	bus_space_read_multi_1(iot, ioh, pdata, buf, l);
   1665   1.12  kiyohara 	BSB(iot, ioh, pst, psz, READ_BEFORE_WRITE);
   1666    1.1     isaki }
   1667   1.12  kiyohara #else
   1668    1.1     isaki static void
   1669   1.12  kiyohara slhci_write_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
   1670    1.1     isaki {
   1671   1.12  kiyohara #if 1
   1672   1.12  kiyohara 	for (; l; addr++, buf++, l--)
   1673   1.12  kiyohara 		slhci_write(sc, addr, *buf);
   1674   1.12  kiyohara #else
   1675   1.12  kiyohara 	bus_size_t paddr, pdata, pst, psz;
   1676   1.12  kiyohara 	bus_space_tag_t iot;
   1677   1.12  kiyohara 	bus_space_handle_t ioh;
   1678   1.12  kiyohara 
   1679   1.12  kiyohara 	paddr = pst = 0;
   1680   1.12  kiyohara 	pdata = sc->sc_stride;
   1681   1.12  kiyohara 	psz = pdata * 2;
   1682   1.12  kiyohara 	iot = sc->sc_iot;
   1683   1.12  kiyohara 	ioh = sc->sc_ioh;
   1684   1.12  kiyohara 
   1685   1.12  kiyohara 	for (; l; addr++, buf++, l--) {
   1686   1.12  kiyohara 		bus_space_write_1(iot, ioh, paddr, addr);
   1687   1.12  kiyohara 		BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
   1688   1.12  kiyohara 		bus_space_write_1(iot, ioh, pdata, *buf);
   1689   1.12  kiyohara 		BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
   1690   1.12  kiyohara 	}
   1691   1.12  kiyohara #endif
   1692    1.1     isaki }
   1693    1.1     isaki 
   1694    1.1     isaki static void
   1695   1.12  kiyohara slhci_read_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
   1696    1.1     isaki {
   1697   1.12  kiyohara #if 1
   1698   1.12  kiyohara 	for (; l; addr++, buf++, l--)
   1699   1.12  kiyohara 		*buf = slhci_read(sc, addr);
   1700   1.12  kiyohara #else
   1701   1.12  kiyohara 	bus_size_t paddr, pdata, pst, psz;
   1702   1.12  kiyohara 	bus_space_tag_t iot;
   1703   1.12  kiyohara 	bus_space_handle_t ioh;
   1704   1.12  kiyohara 
   1705   1.12  kiyohara 	paddr = pst = 0;
   1706   1.12  kiyohara 	pdata = sc->sc_stride;
   1707   1.12  kiyohara 	psz = pdata * 2;
   1708   1.12  kiyohara 	iot = sc->sc_iot;
   1709   1.12  kiyohara 	ioh = sc->sc_ioh;
   1710   1.12  kiyohara 
   1711   1.12  kiyohara 	for (; l; addr++, buf++, l--) {
   1712   1.12  kiyohara 		bus_space_write_1(iot, ioh, paddr, addr);
   1713   1.12  kiyohara 		BSB(iot, ioh, pst, psz, WRITE_BEFORE_READ);
   1714   1.12  kiyohara 		*buf = bus_space_read_1(iot, ioh, pdata);
   1715   1.12  kiyohara 		BSB(iot, ioh, pst, psz, READ_BEFORE_WRITE);
   1716   1.12  kiyohara 	}
   1717   1.12  kiyohara #endif
   1718   1.12  kiyohara }
   1719   1.12  kiyohara #endif
   1720   1.12  kiyohara 
   1721   1.34     skrll /*
   1722   1.34     skrll  * After calling waitintr it is necessary to either call slhci_callback or
   1723   1.37     skrll  * schedule the callback if necessary.  The callback cannot be called directly
   1724   1.37     skrll  * from the hard interrupt since it interrupts at a high IPL and callbacks
   1725   1.34     skrll  * can do copyout and such.
   1726   1.34     skrll  */
   1727   1.12  kiyohara static void
   1728   1.12  kiyohara slhci_waitintr(struct slhci_softc *sc, int wait_time)
   1729   1.12  kiyohara {
   1730   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1731   1.12  kiyohara 	struct slhci_transfers *t;
   1732   1.12  kiyohara 
   1733   1.12  kiyohara 	t = &sc->sc_transfers;
   1734   1.12  kiyohara 
   1735   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   1736   1.12  kiyohara 
   1737   1.48     skrll 	if (__predict_false(sc->sc_bus.ub_usepolling))
   1738   1.12  kiyohara 		wait_time = 12000;
   1739   1.12  kiyohara 
   1740   1.12  kiyohara 	while (t->pend <= wait_time) {
   1741   1.98  pgoyette 		DLOG(D_WAIT, "waiting... frame %jd pend %jd flags %#jx",
   1742   1.12  kiyohara 		    t->frame, t->pend, t->flags, 0);
   1743   1.12  kiyohara 		LK_SLASSERT(t->flags & F_ACTIVE, sc, NULL, NULL, return);
   1744   1.36     skrll 		LK_SLASSERT(t->flags & (F_AINPROG|F_BINPROG), sc, NULL, NULL,
   1745   1.12  kiyohara 		    return);
   1746   1.12  kiyohara 		slhci_dointr(sc);
   1747   1.12  kiyohara 	}
   1748   1.81     skrll 	DLOG(D_WAIT, "... done", 0, 0, 0, 0);
   1749   1.12  kiyohara }
   1750   1.12  kiyohara 
   1751   1.12  kiyohara static int
   1752   1.12  kiyohara slhci_dointr(struct slhci_softc *sc)
   1753   1.12  kiyohara {
   1754   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1755   1.12  kiyohara 	struct slhci_transfers *t;
   1756   1.12  kiyohara 	struct slhci_pipe *tosp;
   1757   1.12  kiyohara 	uint8_t r;
   1758   1.12  kiyohara 
   1759   1.12  kiyohara 	t = &sc->sc_transfers;
   1760   1.12  kiyohara 
   1761   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   1762   1.12  kiyohara 
   1763   1.78     skrll 	if (sc->sc_ier == 0) {
   1764   1.78     skrll 		DLOG(D_INTR, "sc_ier is zero", 0, 0, 0, 0);
   1765   1.12  kiyohara 		return 0;
   1766   1.78     skrll 	}
   1767   1.12  kiyohara 
   1768   1.12  kiyohara 	r = slhci_read(sc, SL11_ISR);
   1769   1.12  kiyohara 
   1770   1.12  kiyohara #ifdef SLHCI_DEBUG
   1771   1.51     skrll 	if (slhcidebug & SLHCI_D_INTR && r & sc->sc_ier &&
   1772   1.88     skrll 	    ((r & ~(SL11_ISR_SOF|SL11_ISR_DATA)) || slhcidebug & SLHCI_D_SOF)) {
   1773   1.12  kiyohara 		uint8_t e, f;
   1774   1.12  kiyohara 
   1775   1.12  kiyohara 		e = slhci_read(sc, SL11_IER);
   1776   1.12  kiyohara 		f = slhci_read(sc, SL11_CTRL);
   1777   1.79     skrll 		DDOLOG("Flags=%#x IER=%#x ISR=%#x CTRL=%#x", t->flags, e, r, f);
   1778   1.79     skrll 		DDOLOGCTRL(f);
   1779   1.79     skrll 		DDOLOGISR(r);
   1780   1.12  kiyohara 	}
   1781   1.12  kiyohara #endif
   1782   1.12  kiyohara 
   1783   1.40     skrll 	/*
   1784   1.40     skrll 	 * check IER for corruption occasionally.  Assume that the above
   1785   1.40     skrll 	 * sc_ier == 0 case works correctly.
   1786   1.40     skrll 	 */
   1787   1.12  kiyohara 	if (__predict_false(sc->sc_ier_check++ > SLHCI_IER_CHECK_FREQUENCY)) {
   1788   1.12  kiyohara 		sc->sc_ier_check = 0;
   1789   1.12  kiyohara 		if (sc->sc_ier != slhci_read(sc, SL11_IER)) {
   1790   1.36     skrll 			printf("%s: IER value corrupted! halted\n",
   1791   1.12  kiyohara 			    SC_NAME(sc));
   1792   1.79     skrll 			DDOLOG("IER value corrupted! halted", 0, 0, 0, 0);
   1793   1.36     skrll 			slhci_halt(sc, NULL, NULL);
   1794   1.12  kiyohara 			return 1;
   1795   1.12  kiyohara 		}
   1796   1.12  kiyohara 	}
   1797   1.12  kiyohara 
   1798   1.12  kiyohara 	r &= sc->sc_ier;
   1799   1.12  kiyohara 
   1800   1.78     skrll 	if (r == 0) {
   1801   1.78     skrll 		DLOG(D_INTR, "r is zero", 0, 0, 0, 0);
   1802   1.12  kiyohara 		return 0;
   1803   1.78     skrll 	}
   1804   1.12  kiyohara 
   1805   1.12  kiyohara 	sc->sc_ier_check = 0;
   1806   1.12  kiyohara 
   1807   1.12  kiyohara 	slhci_write(sc, SL11_ISR, r);
   1808   1.12  kiyohara 	BSB_SYNC(sc->iot, sc->ioh, sc->pst, sc->psz);
   1809   1.12  kiyohara 
   1810   1.12  kiyohara 	/* If we have an insertion event we do not care about anything else. */
   1811   1.12  kiyohara 	if (__predict_false(r & SL11_ISR_INSERT)) {
   1812   1.12  kiyohara 		slhci_insert(sc);
   1813   1.78     skrll 		DLOG(D_INTR, "... done", 0, 0, 0, 0);
   1814   1.12  kiyohara 		return 1;
   1815   1.12  kiyohara 	}
   1816   1.12  kiyohara 
   1817   1.12  kiyohara 	stop_cc_time(&t_intr);
   1818   1.12  kiyohara 	start_cc_time(&t_intr, r);
   1819   1.12  kiyohara 
   1820   1.12  kiyohara 	if (r & SL11_ISR_SOF) {
   1821   1.12  kiyohara 		t->frame++;
   1822   1.12  kiyohara 
   1823   1.12  kiyohara 		gcq_merge_tail(&t->q[Q_CB], &t->q[Q_NEXT_CB]);
   1824   1.12  kiyohara 
   1825   1.34     skrll 		/*
   1826   1.34     skrll 		 * SOFCHECK flags are cleared in tstart.  Two flags are needed
   1827   1.37     skrll 		 * since the first SOF interrupt processed after the transfer
   1828   1.37     skrll 		 * is started might have been generated before the transfer
   1829   1.34     skrll 		 * was started.
   1830   1.34     skrll 		 */
   1831   1.37     skrll 		if (__predict_false(t->flags & F_SOFCHECK2 && t->flags &
   1832   1.12  kiyohara 		    (F_AINPROG|F_BINPROG))) {
   1833   1.12  kiyohara 			printf("%s: Missed transfer completion. halted\n",
   1834   1.12  kiyohara 			    SC_NAME(sc));
   1835   1.79     skrll 			DDOLOG("Missed transfer completion. halted", 0, 0, 0,
   1836   1.79     skrll 			    0);
   1837   1.12  kiyohara 			slhci_halt(sc, NULL, NULL);
   1838   1.12  kiyohara 			return 1;
   1839   1.12  kiyohara 		} else if (t->flags & F_SOFCHECK1) {
   1840   1.12  kiyohara 			t->flags |= F_SOFCHECK2;
   1841   1.12  kiyohara 		} else
   1842   1.12  kiyohara 			t->flags |= F_SOFCHECK1;
   1843   1.12  kiyohara 
   1844   1.12  kiyohara 		if (t->flags & F_CHANGE)
   1845   1.12  kiyohara 			t->flags |= F_ROOTINTR;
   1846   1.12  kiyohara 
   1847   1.12  kiyohara 		while (__predict_true(GOT_FIRST_TO(tosp, t)) &&
   1848   1.12  kiyohara 		    __predict_false(tosp->to_frame <= t->frame)) {
   1849   1.48     skrll 			tosp->xfer->ux_status = USBD_TIMEOUT;
   1850   1.12  kiyohara 			slhci_do_abort(sc, tosp, tosp->xfer);
   1851   1.12  kiyohara 			enter_callback(t, tosp);
   1852   1.12  kiyohara 		}
   1853   1.12  kiyohara 
   1854   1.34     skrll 		/*
   1855   1.34     skrll 		 * Start any waiting transfers right away.  If none, we will
   1856   1.34     skrll 		 * start any new transfers later.
   1857   1.34     skrll 		 */
   1858   1.12  kiyohara 		slhci_tstart(sc);
   1859   1.12  kiyohara 	}
   1860   1.12  kiyohara 
   1861   1.12  kiyohara 	if (r & (SL11_ISR_USBA|SL11_ISR_USBB)) {
   1862   1.12  kiyohara 		int ab;
   1863   1.12  kiyohara 
   1864   1.36     skrll 		if ((r & (SL11_ISR_USBA|SL11_ISR_USBB)) ==
   1865   1.12  kiyohara 		    (SL11_ISR_USBA|SL11_ISR_USBB)) {
   1866   1.12  kiyohara 			if (!(t->flags & (F_AINPROG|F_BINPROG)))
   1867   1.12  kiyohara 				return 1; /* presume card pulled */
   1868   1.12  kiyohara 
   1869   1.36     skrll 			LK_SLASSERT((t->flags & (F_AINPROG|F_BINPROG)) !=
   1870   1.12  kiyohara 			    (F_AINPROG|F_BINPROG), sc, NULL, NULL, return 1);
   1871   1.12  kiyohara 
   1872   1.34     skrll 			/*
   1873   1.34     skrll 			 * This should never happen (unless card removal just
   1874   1.12  kiyohara 			 * occurred) but appeared frequently when both
   1875   1.36     skrll 			 * transfers were started at the same time and was
   1876   1.36     skrll 			 * accompanied by data corruption.  It still happens
   1877   1.36     skrll 			 * at times.  I have not seen data correption except
   1878   1.36     skrll 			 * when the STATUS bit gets set, which now causes the
   1879   1.36     skrll 			 * driver to halt, however this should still not
   1880   1.36     skrll 			 * happen so the warning is kept.  See comment in
   1881   1.12  kiyohara 			 * abdone, below.
   1882   1.12  kiyohara 			 */
   1883   1.12  kiyohara 			printf("%s: Transfer reported done but not started! "
   1884   1.12  kiyohara 			    "Verify data integrity if not detaching. "
   1885   1.12  kiyohara 			    " flags %#x r %x\n", SC_NAME(sc), t->flags, r);
   1886   1.12  kiyohara 
   1887   1.12  kiyohara 			if (!(t->flags & F_AINPROG))
   1888   1.12  kiyohara 				r &= ~SL11_ISR_USBA;
   1889   1.12  kiyohara 			else
   1890   1.12  kiyohara 				r &= ~SL11_ISR_USBB;
   1891   1.12  kiyohara 		}
   1892   1.12  kiyohara 		t->pend = INT_MAX;
   1893   1.12  kiyohara 
   1894   1.12  kiyohara 		if (r & SL11_ISR_USBA)
   1895   1.12  kiyohara 			ab = A;
   1896   1.36     skrll 		else
   1897   1.12  kiyohara 			ab = B;
   1898   1.12  kiyohara 
   1899   1.34     skrll 		/*
   1900   1.34     skrll 		 * This happens when a low speed device is attached to
   1901   1.37     skrll 		 * a hub with chip rev 1.5.  SOF stops, but a few transfers
   1902   1.12  kiyohara 		 * still work before causing this error.
   1903   1.12  kiyohara 		 */
   1904   1.12  kiyohara 		if (!(t->flags & (ab ? F_BINPROG : F_AINPROG))) {
   1905   1.36     skrll 			printf("%s: %s done but not in progress! halted\n",
   1906   1.12  kiyohara 			    SC_NAME(sc), ab ? "B" : "A");
   1907   1.79     skrll 			DDOLOG("AB=%d done but not in progress! halted", ab,
   1908   1.79     skrll 			    0, 0, 0);
   1909   1.12  kiyohara 			slhci_halt(sc, NULL, NULL);
   1910   1.12  kiyohara 			return 1;
   1911   1.12  kiyohara 		}
   1912   1.12  kiyohara 
   1913   1.12  kiyohara 		t->flags &= ~(ab ? F_BINPROG : F_AINPROG);
   1914   1.12  kiyohara 		slhci_tstart(sc);
   1915   1.12  kiyohara 		stop_cc_time(&t_ab[ab]);
   1916   1.12  kiyohara 		start_cc_time(&t_abdone, t->flags);
   1917   1.12  kiyohara 		slhci_abdone(sc, ab);
   1918   1.12  kiyohara 		stop_cc_time(&t_abdone);
   1919   1.12  kiyohara 	}
   1920   1.12  kiyohara 
   1921   1.12  kiyohara 	slhci_dotransfer(sc);
   1922   1.12  kiyohara 
   1923   1.78     skrll 	DLOG(D_INTR, "... done", 0, 0, 0, 0);
   1924   1.78     skrll 
   1925   1.12  kiyohara 	return 1;
   1926   1.12  kiyohara }
   1927   1.12  kiyohara 
   1928   1.12  kiyohara static void
   1929   1.12  kiyohara slhci_abdone(struct slhci_softc *sc, int ab)
   1930   1.12  kiyohara {
   1931   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   1932   1.12  kiyohara 	struct slhci_transfers *t;
   1933   1.12  kiyohara 	struct slhci_pipe *spipe;
   1934   1.12  kiyohara 	struct usbd_xfer *xfer;
   1935   1.36     skrll 	uint8_t status, buf_start;
   1936   1.12  kiyohara 	uint8_t *target_buf;
   1937   1.12  kiyohara 	unsigned int actlen;
   1938   1.12  kiyohara 	int head;
   1939   1.12  kiyohara 
   1940   1.12  kiyohara 	t = &sc->sc_transfers;
   1941   1.12  kiyohara 
   1942   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   1943   1.12  kiyohara 
   1944   1.98  pgoyette 	DLOG(D_TRACE, "ABDONE flags %#jx", t->flags, 0,0,0);
   1945   1.12  kiyohara 
   1946   1.98  pgoyette 	DLOG(D_MSG, "DONE AB=%jd spipe %#jx len %jd xfer %#jx", ab,
   1947   1.98  pgoyette 	    t->spipe[ab], (uintptr_t)t->len[ab],
   1948   1.98  pgoyette 	    (uintptr_t)(t->spipe[ab] ? t->spipe[ab]->xfer : NULL));
   1949   1.12  kiyohara 
   1950   1.12  kiyohara 	spipe = t->spipe[ab];
   1951   1.12  kiyohara 
   1952   1.34     skrll 	/*
   1953   1.34     skrll 	 * skip this one if aborted; do not call return from the rest of the
   1954   1.34     skrll 	 * function unless halting, else t->len will not be cleared.
   1955   1.34     skrll 	 */
   1956   1.12  kiyohara 	if (spipe == NULL)
   1957   1.12  kiyohara 		goto done;
   1958   1.12  kiyohara 
   1959   1.12  kiyohara 	t->spipe[ab] = NULL;
   1960   1.12  kiyohara 
   1961   1.12  kiyohara 	xfer = spipe->xfer;
   1962   1.12  kiyohara 
   1963   1.12  kiyohara 	gcq_remove(&spipe->to);
   1964   1.12  kiyohara 
   1965   1.12  kiyohara 	LK_SLASSERT(xfer != NULL, sc, spipe, NULL, return);
   1966   1.12  kiyohara 
   1967   1.12  kiyohara 	status = slhci_read(sc, slhci_tregs[ab][STAT]);
   1968   1.12  kiyohara 
   1969   1.12  kiyohara 	/*
   1970   1.36     skrll 	 * I saw no status or remaining length greater than the requested
   1971   1.36     skrll 	 * length in early driver versions in circumstances I assumed caused
   1972   1.36     skrll 	 * excess power draw.  I am no longer able to reproduce this when
   1973   1.36     skrll 	 * causing excess power draw circumstances.
   1974   1.36     skrll 	 *
   1975   1.36     skrll 	 * Disabling a power check and attaching aue to a keyboard and hub
   1976   1.36     skrll 	 * that is directly attached (to CFU1U, 100mA max, aue 160mA, keyboard
   1977   1.36     skrll 	 * 98mA) sometimes works and sometimes fails to configure.  After
   1978   1.36     skrll 	 * removing the aue and attaching a self-powered umass dvd reader
   1979   1.36     skrll 	 * (unknown if it draws power from the host also) soon a single Error
   1980   1.36     skrll 	 * status occurs then only timeouts. The controller soon halts freeing
   1981   1.36     skrll 	 * memory due to being ONQU instead of BUSY.  This may be the same
   1982   1.36     skrll 	 * basic sequence that caused the no status/bad length errors.  The
   1983   1.36     skrll 	 * umass device seems to work (better at least) with the keyboard hub
   1984   1.36     skrll 	 * when not first attaching aue (tested once reading an approximately
   1985   1.12  kiyohara 	 * 200MB file).
   1986   1.36     skrll 	 *
   1987   1.36     skrll 	 * Overflow can indicate that the device and host disagree about how
   1988  1.102   msaitoh 	 * much data has been transferred.  This may indicate a problem at any
   1989   1.36     skrll 	 * point during the transfer, not just when the error occurs.  It may
   1990   1.12  kiyohara 	 * indicate data corruption.  A warning message is printed.
   1991   1.12  kiyohara 	 *
   1992   1.36     skrll 	 * Trying to use both A and B transfers at the same time results in
   1993   1.36     skrll 	 * incorrect transfer completion ISR reports and the status will then
   1994   1.36     skrll 	 * include SL11_EPSTAT_SETUP, which is apparently set while the
   1995   1.36     skrll 	 * transfer is in progress.  I also noticed data corruption, even
   1996   1.36     skrll 	 * after waiting for the transfer to complete. The driver now avoids
   1997   1.12  kiyohara 	 * trying to start both at the same time.
   1998   1.12  kiyohara 	 *
   1999   1.36     skrll 	 * I had accidently initialized the B registers before they were valid
   2000   1.36     skrll 	 * in some driver versions.  Since every other performance enhancing
   2001   1.36     skrll 	 * feature has been confirmed buggy in the errata doc, I have not
   2002   1.12  kiyohara 	 * tried both transfers at once again with the documented
   2003   1.12  kiyohara 	 * initialization order.
   2004   1.36     skrll 	 *
   2005   1.36     skrll 	 * However, I have seen this problem again ("done but not started"
   2006   1.36     skrll 	 * errors), which in some cases cases the SETUP status bit to remain
   2007   1.36     skrll 	 * set on future transfers.  In other cases, the SETUP bit is not set
   2008  1.108    andvar 	 * and no data corruption occurs.  This occurred while using both umass
   2009   1.36     skrll 	 * and aue on a powered hub (maybe triggered by some local activity
   2010   1.36     skrll 	 * also) and needs several reads of the 200MB file to trigger.  The
   2011   1.12  kiyohara 	 * driver now halts if SETUP is detected.
   2012   1.12  kiyohara  	 */
   2013   1.12  kiyohara 
   2014   1.12  kiyohara 	actlen = 0;
   2015   1.12  kiyohara 
   2016   1.12  kiyohara 	if (__predict_false(!status)) {
   2017   1.12  kiyohara 		DDOLOG("no status! xfer %p spipe %p", xfer, spipe, 0,0);
   2018   1.12  kiyohara 		printf("%s: no status! halted\n", SC_NAME(sc));
   2019   1.12  kiyohara 		slhci_halt(sc, spipe, xfer);
   2020   1.12  kiyohara 		return;
   2021   1.36     skrll 	}
   2022   1.12  kiyohara 
   2023   1.12  kiyohara #ifdef SLHCI_DEBUG
   2024   1.79     skrll 	if ((slhcidebug & SLHCI_D_NAK) ||
   2025   1.79     skrll 	    (status & SL11_EPSTAT_ERRBITS) != SL11_EPSTAT_NAK) {
   2026   1.79     skrll 	    	DDOLOG("USB Status = %#.2x", status, 0, 0, 0);
   2027   1.84     skrll 		DDOLOGSTATUS(status);
   2028   1.79     skrll 	}
   2029   1.12  kiyohara #endif
   2030   1.12  kiyohara 
   2031   1.12  kiyohara 	if (!(status & SL11_EPSTAT_ERRBITS)) {
   2032   1.96     skrll 		unsigned int cont = slhci_read(sc, slhci_tregs[ab][CONT]);
   2033   1.96     skrll 		unsigned int len = spipe->tregs[LEN];
   2034   1.98  pgoyette 		DLOG(D_XFER, "cont %jd len %jd", cont, len, 0, 0);
   2035   1.96     skrll 		if ((status & SL11_EPSTAT_OVERFLOW) || cont > len) {
   2036   1.96     skrll 			DDOLOG("overflow - cont %d len %d xfer->ux_length %d "
   2037   1.96     skrll 			    "xfer->actlen %d", cont, len, xfer->ux_length,
   2038   1.96     skrll 			    xfer->ux_actlen);
   2039   1.96     skrll 			printf("%s: overflow cont %d len %d xfer->ux_length"
   2040   1.96     skrll 			    " %d xfer->ux_actlen %d\n", SC_NAME(sc), cont,
   2041   1.96     skrll 			    len, xfer->ux_length, xfer->ux_actlen);
   2042   1.96     skrll 			actlen = len;
   2043   1.12  kiyohara 		} else {
   2044   1.96     skrll 			actlen = len - cont;
   2045   1.12  kiyohara 		}
   2046   1.96     skrll 		spipe->nerrs = 0;
   2047   1.12  kiyohara 	}
   2048   1.12  kiyohara 
   2049   1.12  kiyohara 	/* Actual copyin done after starting next transfer. */
   2050   1.12  kiyohara 	if (actlen && (spipe->tregs[PID] & SL11_PID_BITS) == SL11_PID_IN) {
   2051   1.12  kiyohara 		target_buf = spipe->buffer;
   2052   1.12  kiyohara 		buf_start = spipe->tregs[ADR];
   2053   1.12  kiyohara 	} else {
   2054   1.12  kiyohara 		target_buf = NULL;
   2055   1.12  kiyohara 		buf_start = 0; /* XXX gcc uninitialized warnings */
   2056   1.12  kiyohara 	}
   2057   1.12  kiyohara 
   2058   1.12  kiyohara 	if (status & SL11_EPSTAT_ERRBITS) {
   2059   1.12  kiyohara 		status &= SL11_EPSTAT_ERRBITS;
   2060   1.12  kiyohara 		if (status & SL11_EPSTAT_SETUP) {
   2061   1.12  kiyohara 			printf("%s: Invalid controller state detected! "
   2062   1.12  kiyohara 			    "halted\n", SC_NAME(sc));
   2063   1.79     skrll 			DDOLOG("Invalid controller state detected! "
   2064   1.79     skrll 			    "halted", 0, 0, 0, 0);
   2065   1.12  kiyohara 			slhci_halt(sc, spipe, xfer);
   2066   1.12  kiyohara 			return;
   2067   1.48     skrll 		} else if (__predict_false(sc->sc_bus.ub_usepolling)) {
   2068   1.92     skrll 			head = Q_CALLBACKS;
   2069   1.92     skrll 			if (status & SL11_EPSTAT_STALL)
   2070   1.48     skrll 				xfer->ux_status = USBD_STALLED;
   2071   1.92     skrll 			else if (status & SL11_EPSTAT_TIMEOUT)
   2072   1.48     skrll 				xfer->ux_status = USBD_TIMEOUT;
   2073   1.92     skrll 			else if (status & SL11_EPSTAT_NAK)
   2074   1.92     skrll 				head = Q_NEXT_CB;
   2075   1.12  kiyohara 			else
   2076   1.48     skrll 				xfer->ux_status = USBD_IOERROR;
   2077   1.92     skrll 		} else if (status & SL11_EPSTAT_NAK) {
   2078   1.92     skrll 			int i = spipe->pipe.up_interval;
   2079   1.92     skrll 			if (i == 0)
   2080   1.92     skrll 				i = 1;
   2081   1.92     skrll 			DDOLOG("xfer %p spipe %p NAK delay by %d", xfer, spipe,
   2082   1.92     skrll 			    i, 0);
   2083   1.92     skrll 			spipe->lastframe = spipe->frame = t->frame + i;
   2084   1.92     skrll 			slhci_queue_timed(sc, spipe);
   2085   1.92     skrll 			goto queued;
   2086   1.36     skrll 		} else if (++spipe->nerrs > SLHCI_MAX_RETRIES ||
   2087   1.92     skrll 		    (status & SL11_EPSTAT_STALL)) {
   2088   1.92     skrll 			DDOLOG("xfer %p spipe %p nerrs %d", xfer, spipe,
   2089   1.92     skrll 			    spipe->nerrs, 0);
   2090   1.92     skrll 			if (status & SL11_EPSTAT_STALL)
   2091   1.48     skrll 				xfer->ux_status = USBD_STALLED;
   2092   1.92     skrll 			else if (status & SL11_EPSTAT_TIMEOUT)
   2093   1.48     skrll 				xfer->ux_status = USBD_TIMEOUT;
   2094   1.12  kiyohara 			else
   2095   1.48     skrll 				xfer->ux_status = USBD_IOERROR;
   2096   1.12  kiyohara 
   2097   1.98  pgoyette 			DLOG(D_ERR, "Max retries reached! status %#jx "
   2098   1.98  pgoyette 			    "xfer->ux_status %jd", status, xfer->ux_status, 0,
   2099   1.79     skrll 			    0);
   2100   1.84     skrll 			DDOLOGSTATUS(status);
   2101   1.12  kiyohara 
   2102   1.12  kiyohara 			head = Q_CALLBACKS;
   2103   1.12  kiyohara 		} else {
   2104   1.12  kiyohara 			head = Q_NEXT_CB;
   2105   1.12  kiyohara 		}
   2106   1.12  kiyohara 	} else if (spipe->ptype == PT_CTRL_SETUP) {
   2107   1.12  kiyohara 		spipe->tregs[PID] = spipe->newpid;
   2108   1.12  kiyohara 
   2109   1.48     skrll 		if (xfer->ux_length) {
   2110   1.36     skrll 			LK_SLASSERT(spipe->newlen[1] != 0, sc, spipe, xfer,
   2111   1.12  kiyohara 			    return);
   2112   1.12  kiyohara 			spipe->tregs[LEN] = spipe->newlen[1];
   2113   1.12  kiyohara 			spipe->bustime = spipe->newbustime[1];
   2114   1.48     skrll 			spipe->buffer = xfer->ux_buf;
   2115   1.12  kiyohara 			spipe->ptype = PT_CTRL_DATA;
   2116   1.12  kiyohara 		} else {
   2117   1.12  kiyohara status_setup:
   2118   1.12  kiyohara 			/* CTRL_DATA swaps direction in PID then jumps here */
   2119   1.12  kiyohara 			spipe->tregs[LEN] = 0;
   2120   1.12  kiyohara 			if (spipe->pflags & PF_LS)
   2121   1.12  kiyohara 				spipe->bustime = SLHCI_LS_CONST;
   2122   1.12  kiyohara 			else
   2123   1.12  kiyohara 				spipe->bustime = SLHCI_FS_CONST;
   2124   1.12  kiyohara 			spipe->ptype = PT_CTRL_STATUS;
   2125   1.12  kiyohara 			spipe->buffer = NULL;
   2126   1.12  kiyohara 		}
   2127   1.12  kiyohara 
   2128   1.12  kiyohara 		/* Status or first data packet must be DATA1. */
   2129   1.12  kiyohara 		spipe->control |= SL11_EPCTRL_DATATOGGLE;
   2130   1.12  kiyohara 		if ((spipe->tregs[PID] & SL11_PID_BITS) == SL11_PID_IN)
   2131   1.12  kiyohara 			spipe->control &= ~SL11_EPCTRL_DIRECTION;
   2132   1.36     skrll 		else
   2133   1.12  kiyohara 			spipe->control |= SL11_EPCTRL_DIRECTION;
   2134   1.12  kiyohara 
   2135   1.12  kiyohara 		head = Q_CB;
   2136   1.12  kiyohara 	} else if (spipe->ptype == PT_CTRL_STATUS) {
   2137   1.12  kiyohara 		head = Q_CALLBACKS;
   2138   1.12  kiyohara 	} else { /* bulk, intr, control data */
   2139   1.48     skrll 		xfer->ux_actlen += actlen;
   2140   1.12  kiyohara 		spipe->control ^= SL11_EPCTRL_DATATOGGLE;
   2141   1.12  kiyohara 
   2142   1.90     skrll 		if (actlen == spipe->tregs[LEN] &&
   2143   1.90     skrll 		    (xfer->ux_length > xfer->ux_actlen || spipe->wantshort)) {
   2144   1.12  kiyohara 			spipe->buffer += actlen;
   2145   1.48     skrll 			LK_SLASSERT(xfer->ux_length >= xfer->ux_actlen, sc,
   2146   1.12  kiyohara 			    spipe, xfer, return);
   2147   1.48     skrll 			if (xfer->ux_length - xfer->ux_actlen < actlen) {
   2148   1.12  kiyohara 				spipe->wantshort = 0;
   2149   1.12  kiyohara 				spipe->tregs[LEN] = spipe->newlen[0];
   2150   1.12  kiyohara 				spipe->bustime = spipe->newbustime[0];
   2151   1.48     skrll 				LK_SLASSERT(xfer->ux_actlen +
   2152   1.48     skrll 				    spipe->tregs[LEN] == xfer->ux_length, sc,
   2153   1.12  kiyohara 				    spipe, xfer, return);
   2154   1.12  kiyohara 			}
   2155   1.12  kiyohara 			head = Q_CB;
   2156   1.12  kiyohara 		} else if (spipe->ptype == PT_CTRL_DATA) {
   2157   1.12  kiyohara 			spipe->tregs[PID] ^= SLHCI_PID_SWAP_IN_OUT;
   2158   1.12  kiyohara 			goto status_setup;
   2159   1.12  kiyohara 		} else {
   2160   1.12  kiyohara 			if (spipe->ptype == PT_INTR) {
   2161   1.36     skrll 				spipe->lastframe +=
   2162   1.48     skrll 				    spipe->pipe.up_interval;
   2163   1.34     skrll 				/*
   2164   1.34     skrll 				 * If ack, we try to keep the
   2165   1.37     skrll 				 * interrupt rate by using lastframe
   2166   1.34     skrll 				 * instead of the current frame.
   2167   1.34     skrll 				 */
   2168   1.12  kiyohara 				spipe->frame = spipe->lastframe +
   2169   1.48     skrll 				    spipe->pipe.up_interval;
   2170   1.12  kiyohara 			}
   2171   1.12  kiyohara 
   2172   1.34     skrll 			/*
   2173   1.34     skrll 			 * Set the toggle for the next transfer.  It
   2174   1.37     skrll 			 * has already been toggled above, so the
   2175   1.37     skrll 			 * current setting will apply to the next
   2176   1.34     skrll 			 * transfer.
   2177   1.34     skrll 			 */
   2178   1.12  kiyohara 			if (spipe->control & SL11_EPCTRL_DATATOGGLE)
   2179   1.12  kiyohara 				spipe->pflags |= PF_TOGGLE;
   2180   1.12  kiyohara 			else
   2181   1.12  kiyohara 				spipe->pflags &= ~PF_TOGGLE;
   2182   1.12  kiyohara 
   2183   1.12  kiyohara 			head = Q_CALLBACKS;
   2184   1.12  kiyohara 		}
   2185   1.12  kiyohara 	}
   2186   1.12  kiyohara 
   2187   1.12  kiyohara 	if (head == Q_CALLBACKS) {
   2188   1.12  kiyohara 		gcq_remove(&spipe->to);
   2189   1.12  kiyohara 
   2190   1.48     skrll 	 	if (xfer->ux_status == USBD_IN_PROGRESS) {
   2191   1.48     skrll 			LK_SLASSERT(xfer->ux_actlen <= xfer->ux_length, sc,
   2192   1.12  kiyohara 			    spipe, xfer, return);
   2193   1.48     skrll 			xfer->ux_status = USBD_NORMAL_COMPLETION;
   2194   1.12  kiyohara 		}
   2195   1.12  kiyohara 	}
   2196   1.12  kiyohara 
   2197   1.12  kiyohara 	enter_q(t, spipe, head);
   2198   1.12  kiyohara 
   2199   1.12  kiyohara queued:
   2200   1.12  kiyohara 	if (target_buf != NULL) {
   2201   1.12  kiyohara 		slhci_dotransfer(sc);
   2202   1.12  kiyohara 		start_cc_time(&t_copy_from_dev, actlen);
   2203   1.12  kiyohara 		slhci_read_multi(sc, buf_start, target_buf, actlen);
   2204   1.12  kiyohara 		stop_cc_time(&t_copy_from_dev);
   2205   1.12  kiyohara 		DLOGBUF(D_BUF, target_buf, actlen);
   2206   1.12  kiyohara 		t->pend -= SLHCI_FS_CONST + SLHCI_FS_DATA_TIME(actlen);
   2207   1.12  kiyohara 	}
   2208   1.12  kiyohara 
   2209   1.12  kiyohara done:
   2210   1.12  kiyohara 	t->len[ab] = -1;
   2211   1.12  kiyohara }
   2212   1.12  kiyohara 
   2213   1.12  kiyohara static void
   2214   1.12  kiyohara slhci_tstart(struct slhci_softc *sc)
   2215   1.12  kiyohara {
   2216   1.12  kiyohara 	struct slhci_transfers *t;
   2217   1.12  kiyohara 	struct slhci_pipe *spipe;
   2218   1.12  kiyohara 	int remaining_bustime;
   2219   1.12  kiyohara 
   2220   1.12  kiyohara 	t = &sc->sc_transfers;
   2221   1.12  kiyohara 
   2222   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2223   1.12  kiyohara 
   2224   1.12  kiyohara 	if (!(t->flags & (F_AREADY|F_BREADY)))
   2225   1.12  kiyohara 		return;
   2226   1.12  kiyohara 
   2227   1.12  kiyohara 	if (t->flags & (F_AINPROG|F_BINPROG|F_DISABLED))
   2228   1.12  kiyohara 		return;
   2229   1.12  kiyohara 
   2230   1.34     skrll 	/*
   2231   1.34     skrll 	 * We have about 6 us to get from the bus time check to
   2232   1.37     skrll 	 * starting the transfer or we might babble or the chip might fail to
   2233   1.37     skrll 	 * signal transfer complete.  This leaves no time for any other
   2234   1.25     rmind 	 * interrupts.
   2235   1.25     rmind 	 */
   2236   1.12  kiyohara 	remaining_bustime = (int)(slhci_read(sc, SL811_CSOF)) << 6;
   2237   1.12  kiyohara 	remaining_bustime -= SLHCI_END_BUSTIME;
   2238   1.12  kiyohara 
   2239   1.34     skrll 	/*
   2240   1.34     skrll 	 * Start one transfer only, clearing any aborted transfers that are
   2241   1.37     skrll 	 * not yet in progress and skipping missed isoc. It is easier to copy
   2242   1.37     skrll 	 * & paste most of the A/B sections than to make the logic work
   2243   1.34     skrll 	 * otherwise and this allows better constant use.
   2244   1.34     skrll 	 */
   2245   1.12  kiyohara 	if (t->flags & F_AREADY) {
   2246   1.12  kiyohara 		spipe = t->spipe[A];
   2247   1.12  kiyohara 		if (spipe == NULL) {
   2248   1.12  kiyohara 			t->flags &= ~F_AREADY;
   2249   1.12  kiyohara 			t->len[A] = -1;
   2250   1.12  kiyohara 		} else if (remaining_bustime >= spipe->bustime) {
   2251   1.12  kiyohara 			t->flags &= ~(F_AREADY|F_SOFCHECK1|F_SOFCHECK2);
   2252   1.12  kiyohara 			t->flags |= F_AINPROG;
   2253   1.12  kiyohara 			start_cc_time(&t_ab[A], spipe->tregs[LEN]);
   2254   1.12  kiyohara 			slhci_write(sc, SL11_E0CTRL, spipe->control);
   2255   1.12  kiyohara 			goto pend;
   2256   1.36     skrll 		}
   2257   1.12  kiyohara 	}
   2258   1.12  kiyohara 	if (t->flags & F_BREADY) {
   2259   1.12  kiyohara 		spipe = t->spipe[B];
   2260   1.12  kiyohara 		if (spipe == NULL) {
   2261   1.12  kiyohara 			t->flags &= ~F_BREADY;
   2262   1.12  kiyohara 			t->len[B] = -1;
   2263   1.12  kiyohara 		} else if (remaining_bustime >= spipe->bustime) {
   2264   1.12  kiyohara 			t->flags &= ~(F_BREADY|F_SOFCHECK1|F_SOFCHECK2);
   2265   1.12  kiyohara 			t->flags |= F_BINPROG;
   2266   1.12  kiyohara 			start_cc_time(&t_ab[B], spipe->tregs[LEN]);
   2267   1.12  kiyohara 			slhci_write(sc, SL11_E1CTRL, spipe->control);
   2268   1.12  kiyohara pend:
   2269   1.12  kiyohara 			t->pend = spipe->bustime;
   2270   1.12  kiyohara 		}
   2271   1.12  kiyohara 	}
   2272   1.12  kiyohara }
   2273   1.12  kiyohara 
   2274   1.12  kiyohara static void
   2275   1.12  kiyohara slhci_dotransfer(struct slhci_softc *sc)
   2276   1.12  kiyohara {
   2277   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2278   1.12  kiyohara 	struct slhci_transfers *t;
   2279   1.12  kiyohara 	struct slhci_pipe *spipe;
   2280   1.12  kiyohara 	int ab, i;
   2281   1.12  kiyohara 
   2282   1.12  kiyohara 	t = &sc->sc_transfers;
   2283   1.12  kiyohara 
   2284   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2285   1.12  kiyohara 
   2286   1.12  kiyohara  	while ((t->len[A] == -1 || t->len[B] == -1) &&
   2287   1.36     skrll 	    (GOT_FIRST_TIMED_COND(spipe, t, spipe->frame <= t->frame) ||
   2288   1.12  kiyohara 	    GOT_FIRST_CB(spipe, t))) {
   2289   1.12  kiyohara 		LK_SLASSERT(spipe->xfer != NULL, sc, spipe, NULL, return);
   2290   1.36     skrll 		LK_SLASSERT(spipe->ptype != PT_ROOT_CTRL && spipe->ptype !=
   2291   1.36     skrll 		    PT_ROOT_INTR, sc, spipe, NULL, return);
   2292   1.36     skrll 
   2293   1.36     skrll 		/* Check that this transfer can fit in the remaining memory. */
   2294   1.37     skrll 		if (t->len[A] + t->len[B] + spipe->tregs[LEN] + 1 >
   2295   1.12  kiyohara 		    SL11_MAX_PACKET_SIZE) {
   2296   1.98  pgoyette 			DLOG(D_XFER, "Transfer does not fit. alen %jd blen %jd "
   2297   1.98  pgoyette 			    "len %jd", t->len[A], t->len[B], spipe->tregs[LEN],
   2298   1.12  kiyohara 			    0);
   2299   1.12  kiyohara 			return;
   2300   1.12  kiyohara 		}
   2301   1.12  kiyohara 
   2302   1.12  kiyohara 		gcq_remove(&spipe->xq);
   2303   1.12  kiyohara 
   2304   1.12  kiyohara 		if (t->len[A] == -1) {
   2305   1.12  kiyohara 			ab = A;
   2306   1.12  kiyohara 			spipe->tregs[ADR] = SL11_BUFFER_START;
   2307   1.12  kiyohara 		} else {
   2308   1.12  kiyohara 			ab = B;
   2309   1.37     skrll 			spipe->tregs[ADR] = SL11_BUFFER_END -
   2310   1.12  kiyohara 			    spipe->tregs[LEN];
   2311   1.12  kiyohara 		}
   2312   1.12  kiyohara 
   2313   1.12  kiyohara 		t->len[ab] = spipe->tregs[LEN];
   2314   1.12  kiyohara 
   2315   1.37     skrll 		if (spipe->tregs[LEN] && (spipe->tregs[PID] & SL11_PID_BITS)
   2316   1.12  kiyohara 		    != SL11_PID_IN) {
   2317   1.37     skrll 			start_cc_time(&t_copy_to_dev,
   2318   1.12  kiyohara 			    spipe->tregs[LEN]);
   2319   1.37     skrll 			slhci_write_multi(sc, spipe->tregs[ADR],
   2320   1.12  kiyohara 			    spipe->buffer, spipe->tregs[LEN]);
   2321   1.12  kiyohara 			stop_cc_time(&t_copy_to_dev);
   2322   1.37     skrll 			t->pend -= SLHCI_FS_CONST +
   2323   1.12  kiyohara 			    SLHCI_FS_DATA_TIME(spipe->tregs[LEN]);
   2324   1.12  kiyohara 		}
   2325   1.12  kiyohara 
   2326   1.98  pgoyette 		DLOG(D_MSG, "NEW TRANSFER AB=%jd flags %#jx alen %jd blen %jd",
   2327   1.79     skrll 		    ab, t->flags, t->len[0], t->len[1]);
   2328   1.12  kiyohara 
   2329   1.12  kiyohara 		if (spipe->tregs[LEN])
   2330   1.12  kiyohara 			i = 0;
   2331   1.12  kiyohara 		else
   2332   1.12  kiyohara 			i = 1;
   2333   1.12  kiyohara 
   2334   1.12  kiyohara 		for (; i <= 3; i++)
   2335   1.12  kiyohara 			if (t->current_tregs[ab][i] != spipe->tregs[i]) {
   2336   1.12  kiyohara 				t->current_tregs[ab][i] = spipe->tregs[i];
   2337   1.37     skrll 				slhci_write(sc, slhci_tregs[ab][i],
   2338   1.12  kiyohara 				    spipe->tregs[i]);
   2339   1.12  kiyohara 			}
   2340   1.12  kiyohara 
   2341   1.98  pgoyette 		DLOG(D_SXFER, "Transfer len %jd pid %#jx dev %jd type %jd",
   2342   1.37     skrll 		    spipe->tregs[LEN], spipe->tregs[PID], spipe->tregs[DEV],
   2343   1.79     skrll 	    	    spipe->ptype);
   2344   1.12  kiyohara 
   2345   1.12  kiyohara 		t->spipe[ab] = spipe;
   2346   1.12  kiyohara 		t->flags |= ab ? F_BREADY : F_AREADY;
   2347   1.12  kiyohara 
   2348   1.12  kiyohara 		slhci_tstart(sc);
   2349   1.12  kiyohara 	}
   2350   1.12  kiyohara }
   2351   1.12  kiyohara 
   2352   1.34     skrll /*
   2353   1.73     skrll  * slhci_callback is called after the lock is taken.
   2354   1.34     skrll  */
   2355   1.12  kiyohara static void
   2356   1.41     skrll slhci_callback(struct slhci_softc *sc)
   2357   1.12  kiyohara {
   2358   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2359   1.12  kiyohara 	struct slhci_transfers *t;
   2360   1.12  kiyohara 	struct slhci_pipe *spipe;
   2361   1.12  kiyohara 	struct usbd_xfer *xfer;
   2362   1.12  kiyohara 
   2363   1.12  kiyohara 	t = &sc->sc_transfers;
   2364   1.12  kiyohara 
   2365   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2366   1.12  kiyohara 
   2367   1.98  pgoyette 	DLOG(D_SOFT, "CB flags %#jx", t->flags, 0,0,0);
   2368   1.12  kiyohara 	for (;;) {
   2369   1.12  kiyohara 		if (__predict_false(t->flags & F_ROOTINTR)) {
   2370   1.12  kiyohara 			t->flags &= ~F_ROOTINTR;
   2371   1.12  kiyohara 			if (t->rootintr != NULL) {
   2372   1.12  kiyohara 				u_char *p;
   2373   1.12  kiyohara 
   2374  1.103  riastrad 				KASSERT(t->rootintr->ux_status ==
   2375  1.103  riastrad 				    USBD_IN_PROGRESS);
   2376   1.48     skrll 				p = t->rootintr->ux_buf;
   2377   1.12  kiyohara 				p[0] = 2;
   2378   1.48     skrll 				t->rootintr->ux_actlen = 1;
   2379   1.48     skrll 				t->rootintr->ux_status = USBD_NORMAL_COMPLETION;
   2380   1.12  kiyohara 				xfer = t->rootintr;
   2381   1.12  kiyohara 				goto do_callback;
   2382   1.12  kiyohara 			}
   2383   1.37     skrll 		}
   2384   1.12  kiyohara 
   2385   1.12  kiyohara 
   2386   1.12  kiyohara 		if (!DEQUEUED_CALLBACK(spipe, t))
   2387   1.12  kiyohara 			return;
   2388   1.12  kiyohara 
   2389   1.12  kiyohara 		xfer = spipe->xfer;
   2390   1.12  kiyohara 		LK_SLASSERT(xfer != NULL, sc, spipe, NULL, return);
   2391   1.12  kiyohara 		spipe->xfer = NULL;
   2392   1.98  pgoyette 		DLOG(D_XFER, "xfer callback length %jd actlen %jd spipe %#jx "
   2393   1.98  pgoyette 		    "type %jd", xfer->ux_length, (uintptr_t)xfer->ux_actlen,
   2394   1.98  pgoyette 		    (uintptr_t)spipe, spipe->ptype);
   2395   1.12  kiyohara do_callback:
   2396   1.41     skrll 		slhci_do_callback(sc, xfer);
   2397   1.12  kiyohara 	}
   2398   1.12  kiyohara }
   2399   1.12  kiyohara 
   2400   1.12  kiyohara static void
   2401   1.12  kiyohara slhci_enter_xfer(struct slhci_softc *sc, struct slhci_pipe *spipe)
   2402   1.12  kiyohara {
   2403   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2404   1.12  kiyohara 	struct slhci_transfers *t;
   2405   1.12  kiyohara 
   2406   1.12  kiyohara 	t = &sc->sc_transfers;
   2407   1.12  kiyohara 
   2408   1.41     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2409   1.12  kiyohara 
   2410   1.37     skrll 	if (__predict_false(t->flags & F_DISABLED) ||
   2411   1.12  kiyohara 	    __predict_false(spipe->pflags & PF_GONE)) {
   2412   1.12  kiyohara 		DLOG(D_MSG, "slhci_enter_xfer: DISABLED or GONE", 0,0,0,0);
   2413   1.48     skrll 		spipe->xfer->ux_status = USBD_CANCELLED;
   2414   1.12  kiyohara 	}
   2415   1.12  kiyohara 
   2416   1.48     skrll 	if (spipe->xfer->ux_status == USBD_IN_PROGRESS) {
   2417   1.48     skrll 		if (spipe->xfer->ux_timeout) {
   2418   1.48     skrll 			spipe->to_frame = t->frame + spipe->xfer->ux_timeout;
   2419   1.37     skrll 			slhci_xfer_timer(sc, spipe);
   2420   1.12  kiyohara 		}
   2421   1.48     skrll 		if (spipe->pipe.up_interval)
   2422   1.12  kiyohara 			slhci_queue_timed(sc, spipe);
   2423   1.12  kiyohara 		else
   2424   1.12  kiyohara 			enter_q(t, spipe, Q_CB);
   2425   1.12  kiyohara 	} else
   2426   1.12  kiyohara 		enter_callback(t, spipe);
   2427   1.12  kiyohara }
   2428   1.12  kiyohara 
   2429   1.12  kiyohara static void
   2430   1.12  kiyohara slhci_enter_xfers(struct slhci_softc *sc)
   2431   1.12  kiyohara {
   2432   1.12  kiyohara 	struct slhci_pipe *spipe;
   2433   1.12  kiyohara 
   2434   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2435   1.12  kiyohara 
   2436   1.12  kiyohara 	while (DEQUEUED_WAITQ(spipe, sc))
   2437   1.12  kiyohara 		slhci_enter_xfer(sc, spipe);
   2438   1.12  kiyohara }
   2439   1.12  kiyohara 
   2440   1.12  kiyohara static void
   2441   1.12  kiyohara slhci_queue_timed(struct slhci_softc *sc, struct slhci_pipe *spipe)
   2442   1.12  kiyohara {
   2443   1.12  kiyohara 	struct slhci_transfers *t;
   2444   1.12  kiyohara 	struct gcq *q;
   2445   1.12  kiyohara 	struct slhci_pipe *spp;
   2446   1.12  kiyohara 
   2447   1.12  kiyohara 	t = &sc->sc_transfers;
   2448   1.12  kiyohara 
   2449   1.41     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2450   1.12  kiyohara 
   2451   1.12  kiyohara 	FIND_TIMED(q, t, spp, spp->frame > spipe->frame);
   2452   1.12  kiyohara 	gcq_insert_before(q, &spipe->xq);
   2453   1.12  kiyohara }
   2454   1.12  kiyohara 
   2455   1.12  kiyohara static void
   2456   1.12  kiyohara slhci_xfer_timer(struct slhci_softc *sc, struct slhci_pipe *spipe)
   2457   1.12  kiyohara {
   2458   1.12  kiyohara 	struct slhci_transfers *t;
   2459   1.12  kiyohara 	struct gcq *q;
   2460   1.12  kiyohara 	struct slhci_pipe *spp;
   2461   1.12  kiyohara 
   2462   1.12  kiyohara 	t = &sc->sc_transfers;
   2463   1.12  kiyohara 
   2464   1.41     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2465   1.12  kiyohara 
   2466   1.12  kiyohara 	FIND_TO(q, t, spp, spp->to_frame >= spipe->to_frame);
   2467   1.12  kiyohara 	gcq_insert_before(q, &spipe->to);
   2468   1.12  kiyohara }
   2469   1.12  kiyohara 
   2470   1.12  kiyohara static void
   2471   1.12  kiyohara slhci_callback_schedule(struct slhci_softc *sc)
   2472   1.12  kiyohara {
   2473   1.63     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2474   1.12  kiyohara 	struct slhci_transfers *t;
   2475   1.12  kiyohara 
   2476   1.12  kiyohara 	t = &sc->sc_transfers;
   2477   1.12  kiyohara 
   2478   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2479   1.12  kiyohara 
   2480   1.12  kiyohara 	if (t->flags & F_ACTIVE)
   2481   1.12  kiyohara 		slhci_do_callback_schedule(sc);
   2482   1.12  kiyohara }
   2483   1.12  kiyohara 
   2484   1.12  kiyohara static void
   2485   1.12  kiyohara slhci_do_callback_schedule(struct slhci_softc *sc)
   2486   1.12  kiyohara {
   2487   1.59     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2488   1.12  kiyohara 	struct slhci_transfers *t;
   2489   1.12  kiyohara 
   2490   1.12  kiyohara 	t = &sc->sc_transfers;
   2491   1.12  kiyohara 
   2492   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2493   1.12  kiyohara 
   2494   1.98  pgoyette 	DLOG(D_MSG, "flags %#jx", t->flags, 0, 0, 0);
   2495   1.12  kiyohara 	if (!(t->flags & F_CALLBACK)) {
   2496   1.12  kiyohara 		t->flags |= F_CALLBACK;
   2497   1.16        ad 		softint_schedule(sc->sc_cb_softintr);
   2498   1.12  kiyohara 	}
   2499   1.12  kiyohara }
   2500   1.12  kiyohara 
   2501   1.12  kiyohara #if 0
   2502   1.74     skrll /* must be called with lock taken. */
   2503   1.12  kiyohara /* XXX static */ void
   2504   1.41     skrll slhci_pollxfer(struct slhci_softc *sc, struct usbd_xfer *xfer)
   2505   1.12  kiyohara {
   2506   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2507   1.12  kiyohara 	slhci_dotransfer(sc);
   2508   1.12  kiyohara 	do {
   2509   1.12  kiyohara 		slhci_dointr(sc);
   2510   1.48     skrll 	} while (xfer->ux_status == USBD_IN_PROGRESS);
   2511   1.41     skrll 	slhci_do_callback(sc, xfer);
   2512   1.12  kiyohara }
   2513   1.12  kiyohara #endif
   2514   1.12  kiyohara 
   2515   1.12  kiyohara static usbd_status
   2516   1.37     skrll slhci_do_poll(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
   2517   1.12  kiyohara     usbd_xfer *xfer)
   2518   1.12  kiyohara {
   2519   1.12  kiyohara 	slhci_waitintr(sc, 0);
   2520   1.12  kiyohara 
   2521   1.12  kiyohara 	return USBD_NORMAL_COMPLETION;
   2522   1.12  kiyohara }
   2523   1.12  kiyohara 
   2524   1.12  kiyohara static usbd_status
   2525   1.37     skrll slhci_lsvh_warn(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
   2526   1.12  kiyohara     usbd_xfer *xfer)
   2527   1.12  kiyohara {
   2528   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2529   1.12  kiyohara 	struct slhci_transfers *t;
   2530   1.12  kiyohara 
   2531   1.12  kiyohara 	t = &sc->sc_transfers;
   2532   1.12  kiyohara 
   2533   1.12  kiyohara 	if (!(t->flags & F_LSVH_WARNED)) {
   2534   1.12  kiyohara 		printf("%s: Low speed device via hub disabled, "
   2535   1.12  kiyohara 		    "see slhci(4)\n", SC_NAME(sc));
   2536   1.79     skrll 		DDOLOG("Low speed device via hub disabled, "
   2537   1.79     skrll 		    "see slhci(4)", SC_NAME(sc), 0,0,0);
   2538   1.12  kiyohara 		t->flags |= F_LSVH_WARNED;
   2539   1.12  kiyohara 	}
   2540   1.12  kiyohara 	return USBD_INVAL;
   2541   1.12  kiyohara }
   2542   1.12  kiyohara 
   2543   1.12  kiyohara static usbd_status
   2544   1.37     skrll slhci_isoc_warn(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
   2545   1.12  kiyohara     usbd_xfer *xfer)
   2546   1.12  kiyohara {
   2547   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2548   1.12  kiyohara 	struct slhci_transfers *t;
   2549   1.12  kiyohara 
   2550   1.12  kiyohara 	t = &sc->sc_transfers;
   2551   1.12  kiyohara 
   2552   1.12  kiyohara 	if (!(t->flags & F_ISOC_WARNED)) {
   2553   1.12  kiyohara 		printf("%s: ISOC transfer not supported "
   2554   1.12  kiyohara 		    "(see slhci(4))\n", SC_NAME(sc));
   2555   1.79     skrll 		DDOLOG("ISOC transfer not supported "
   2556   1.79     skrll 		    "(see slhci(4))", 0, 0, 0, 0);
   2557   1.12  kiyohara 		t->flags |= F_ISOC_WARNED;
   2558   1.12  kiyohara 	}
   2559   1.12  kiyohara 	return USBD_INVAL;
   2560   1.12  kiyohara }
   2561   1.12  kiyohara 
   2562   1.12  kiyohara static usbd_status
   2563   1.37     skrll slhci_open_pipe(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
   2564   1.12  kiyohara     usbd_xfer *xfer)
   2565   1.12  kiyohara {
   2566   1.12  kiyohara 	struct slhci_transfers *t;
   2567   1.12  kiyohara 	struct usbd_pipe *pipe;
   2568   1.12  kiyohara 
   2569   1.12  kiyohara 	t = &sc->sc_transfers;
   2570   1.12  kiyohara 	pipe = &spipe->pipe;
   2571   1.12  kiyohara 
   2572   1.12  kiyohara 	if (t->flags & F_DISABLED)
   2573   1.12  kiyohara 		return USBD_CANCELLED;
   2574   1.48     skrll 	else if (pipe->up_interval && !slhci_reserve_bustime(sc, spipe, 1))
   2575   1.12  kiyohara 		return USBD_PENDING_REQUESTS;
   2576   1.12  kiyohara 	else {
   2577   1.12  kiyohara 		enter_all_pipes(t, spipe);
   2578   1.12  kiyohara 		return USBD_NORMAL_COMPLETION;
   2579   1.12  kiyohara 	}
   2580   1.12  kiyohara }
   2581   1.12  kiyohara 
   2582   1.12  kiyohara static usbd_status
   2583   1.37     skrll slhci_close_pipe(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
   2584   1.12  kiyohara     usbd_xfer *xfer)
   2585   1.12  kiyohara {
   2586   1.12  kiyohara 	struct usbd_pipe *pipe;
   2587   1.12  kiyohara 
   2588   1.12  kiyohara 	pipe = &spipe->pipe;
   2589   1.12  kiyohara 
   2590   1.48     skrll 	if (pipe->up_interval && spipe->ptype != PT_ROOT_INTR)
   2591   1.12  kiyohara 		slhci_reserve_bustime(sc, spipe, 0);
   2592   1.12  kiyohara 	gcq_remove(&spipe->ap);
   2593   1.12  kiyohara 	return USBD_NORMAL_COMPLETION;
   2594   1.12  kiyohara }
   2595   1.12  kiyohara 
   2596   1.12  kiyohara static usbd_status
   2597   1.37     skrll slhci_do_abort(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
   2598   1.12  kiyohara     usbd_xfer *xfer)
   2599   1.12  kiyohara {
   2600   1.12  kiyohara 	struct slhci_transfers *t;
   2601   1.12  kiyohara 
   2602   1.12  kiyohara 	t = &sc->sc_transfers;
   2603   1.12  kiyohara 
   2604   1.41     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2605   1.12  kiyohara 
   2606   1.12  kiyohara 	if (spipe->xfer == xfer) {
   2607   1.12  kiyohara 		if (spipe->ptype == PT_ROOT_INTR) {
   2608   1.12  kiyohara 			if (t->rootintr == spipe->xfer) /* XXX assert? */
   2609   1.12  kiyohara 				t->rootintr = NULL;
   2610   1.12  kiyohara 		} else {
   2611   1.12  kiyohara 			gcq_remove(&spipe->to);
   2612   1.12  kiyohara 			gcq_remove(&spipe->xq);
   2613   1.12  kiyohara 
   2614   1.12  kiyohara 			if (t->spipe[A] == spipe) {
   2615   1.12  kiyohara 				t->spipe[A] = NULL;
   2616   1.12  kiyohara 				if (!(t->flags & F_AINPROG))
   2617   1.12  kiyohara 					t->len[A] = -1;
   2618   1.12  kiyohara 			} else if (t->spipe[B] == spipe) {
   2619   1.12  kiyohara 					t->spipe[B] = NULL;
   2620   1.12  kiyohara 				if (!(t->flags & F_BINPROG))
   2621   1.12  kiyohara 					t->len[B] = -1;
   2622   1.12  kiyohara 			}
   2623   1.12  kiyohara 		}
   2624   1.12  kiyohara 
   2625   1.48     skrll 		if (xfer->ux_status != USBD_TIMEOUT) {
   2626   1.12  kiyohara 			spipe->xfer = NULL;
   2627   1.48     skrll 			spipe->pipe.up_repeat = 0; /* XXX timeout? */
   2628   1.12  kiyohara 		}
   2629   1.12  kiyohara 	}
   2630   1.12  kiyohara 
   2631   1.12  kiyohara 	return USBD_NORMAL_COMPLETION;
   2632   1.12  kiyohara }
   2633   1.12  kiyohara 
   2634   1.34     skrll /*
   2635   1.41     skrll  * Called to deactivate or stop use of the controller instead of panicking.
   2636   1.12  kiyohara  * Will cancel the xfer correctly even when not on a list.
   2637   1.12  kiyohara  */
   2638   1.12  kiyohara static usbd_status
   2639   1.48     skrll slhci_halt(struct slhci_softc *sc, struct slhci_pipe *spipe,
   2640   1.48     skrll     struct usbd_xfer *xfer)
   2641   1.12  kiyohara {
   2642   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2643   1.12  kiyohara 	struct slhci_transfers *t;
   2644   1.12  kiyohara 
   2645   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2646   1.12  kiyohara 
   2647   1.12  kiyohara 	t = &sc->sc_transfers;
   2648   1.12  kiyohara 
   2649   1.12  kiyohara 	DDOLOG("Halt! sc %p spipe %p xfer %p", sc, spipe, xfer, 0);
   2650   1.12  kiyohara 
   2651   1.12  kiyohara 	if (spipe != NULL)
   2652   1.12  kiyohara 		slhci_log_spipe(spipe);
   2653   1.12  kiyohara 
   2654   1.12  kiyohara 	if (xfer != NULL)
   2655   1.12  kiyohara 		slhci_log_xfer(xfer);
   2656   1.12  kiyohara 
   2657   1.37     skrll 	if (spipe != NULL && xfer != NULL && spipe->xfer == xfer &&
   2658   1.37     skrll 	    !gcq_onlist(&spipe->xq) && t->spipe[A] != spipe && t->spipe[B] !=
   2659   1.12  kiyohara 	    spipe) {
   2660   1.48     skrll 		xfer->ux_status = USBD_CANCELLED;
   2661   1.12  kiyohara 		enter_callback(t, spipe);
   2662   1.12  kiyohara 	}
   2663   1.12  kiyohara 
   2664   1.12  kiyohara 	if (t->flags & F_ACTIVE) {
   2665   1.12  kiyohara 		slhci_intrchange(sc, 0);
   2666   1.34     skrll 		/*
   2667   1.34     skrll 		 * leave power on when halting in case flash devices or disks
   2668   1.37     skrll 		 * are attached, which may be writing and could be damaged
   2669   1.37     skrll 		 * by abrupt power loss.  The root hub clear power feature
   2670   1.12  kiyohara 		 * should still work after halting.
   2671   1.12  kiyohara 		 */
   2672   1.12  kiyohara 	}
   2673   1.12  kiyohara 
   2674   1.12  kiyohara 	t->flags &= ~F_ACTIVE;
   2675   1.12  kiyohara 	t->flags |= F_UDISABLED;
   2676   1.12  kiyohara 	if (!(t->flags & F_NODEV))
   2677   1.12  kiyohara 		t->flags |= F_NODEV|F_CCONNECT|F_ROOTINTR;
   2678   1.12  kiyohara 	slhci_drain(sc);
   2679    1.1     isaki 
   2680   1.12  kiyohara 	/* One last callback for the drain and device removal. */
   2681   1.12  kiyohara 	slhci_do_callback_schedule(sc);
   2682    1.1     isaki 
   2683   1.12  kiyohara 	return USBD_NORMAL_COMPLETION;
   2684    1.1     isaki }
   2685    1.1     isaki 
   2686   1.34     skrll /*
   2687   1.34     skrll  * There are three interrupt states: no interrupts during reset and after
   2688   1.37     skrll  * device deactivation, INSERT only for no device present but power on, and
   2689   1.12  kiyohara  * SOF, INSERT, ADONE, and BDONE when device is present.
   2690   1.12  kiyohara  */
   2691    1.1     isaki static void
   2692   1.12  kiyohara slhci_intrchange(struct slhci_softc *sc, uint8_t new_ier)
   2693    1.1     isaki {
   2694   1.82     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2695   1.41     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2696   1.12  kiyohara 	if (sc->sc_ier != new_ier) {
   2697   1.98  pgoyette 		DLOG(D_INTR, "New IER %#jx", new_ier, 0, 0, 0);
   2698   1.12  kiyohara 		sc->sc_ier = new_ier;
   2699   1.12  kiyohara 		slhci_write(sc, SL11_IER, new_ier);
   2700   1.12  kiyohara 		BSB_SYNC(sc->iot, sc->ioh, sc->pst, sc->psz);
   2701   1.12  kiyohara 	}
   2702    1.1     isaki }
   2703    1.1     isaki 
   2704   1.34     skrll /*
   2705   1.34     skrll  * Drain: cancel all pending transfers and put them on the callback list and
   2706   1.34     skrll  * set the UDISABLED flag.  UDISABLED is cleared only by reset.
   2707   1.34     skrll  */
   2708   1.12  kiyohara static void
   2709   1.12  kiyohara slhci_drain(struct slhci_softc *sc)
   2710    1.1     isaki {
   2711   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2712   1.12  kiyohara 	struct slhci_transfers *t;
   2713   1.12  kiyohara 	struct slhci_pipe *spipe;
   2714   1.12  kiyohara 	struct gcq *q;
   2715   1.12  kiyohara 	int i;
   2716    1.1     isaki 
   2717   1.44     skrll  	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2718    1.1     isaki 
   2719   1.12  kiyohara 	t = &sc->sc_transfers;
   2720    1.1     isaki 
   2721   1.98  pgoyette 	DLOG(D_MSG, "DRAIN flags %#jx", t->flags, 0,0,0);
   2722    1.1     isaki 
   2723   1.12  kiyohara 	t->pend = INT_MAX;
   2724    1.1     isaki 
   2725  1.104    simonb 	for (i = 0; i <= 1; i++) {
   2726   1.12  kiyohara 		t->len[i] = -1;
   2727   1.12  kiyohara 		if (t->spipe[i] != NULL) {
   2728   1.12  kiyohara 			enter_callback(t, t->spipe[i]);
   2729   1.12  kiyohara 			t->spipe[i] = NULL;
   2730   1.12  kiyohara 		}
   2731    1.1     isaki 	}
   2732    1.1     isaki 
   2733   1.12  kiyohara 	/* Merge the queues into the callback queue. */
   2734   1.12  kiyohara 	gcq_merge_tail(&t->q[Q_CALLBACKS], &t->q[Q_CB]);
   2735   1.12  kiyohara 	gcq_merge_tail(&t->q[Q_CALLBACKS], &t->q[Q_NEXT_CB]);
   2736   1.12  kiyohara 	gcq_merge_tail(&t->q[Q_CALLBACKS], &t->timed);
   2737    1.1     isaki 
   2738   1.34     skrll 	/*
   2739   1.34     skrll 	 * Cancel all pipes.  Note that not all of these may be on the
   2740   1.34     skrll 	 * callback queue yet; some could be in slhci_start, for example.
   2741   1.34     skrll 	 */
   2742   1.12  kiyohara 	FOREACH_AP(q, t, spipe) {
   2743   1.27  kiyohara 		spipe->pflags |= PF_GONE;
   2744   1.48     skrll 		spipe->pipe.up_repeat = 0;
   2745   1.48     skrll 		spipe->pipe.up_aborting = 1;
   2746   1.12  kiyohara 		if (spipe->xfer != NULL)
   2747   1.48     skrll 			spipe->xfer->ux_status = USBD_CANCELLED;
   2748    1.1     isaki 	}
   2749    1.1     isaki 
   2750   1.12  kiyohara 	gcq_remove_all(&t->to);
   2751    1.1     isaki 
   2752   1.12  kiyohara 	t->flags |= F_UDISABLED;
   2753   1.12  kiyohara 	t->flags &= ~(F_AREADY|F_BREADY|F_AINPROG|F_BINPROG|F_LOWSPEED);
   2754    1.1     isaki }
   2755    1.1     isaki 
   2756   1.34     skrll /*
   2757   1.34     skrll  * RESET: SL11_CTRL_RESETENGINE=1 and SL11_CTRL_JKSTATE=0 for 50ms
   2758   1.12  kiyohara  * reconfigure SOF after reset, must wait 2.5us before USB bus activity (SOF)
   2759   1.37     skrll  * check attached device speed.
   2760   1.37     skrll  * must wait 100ms before USB transaction according to app note, 10ms
   2761   1.12  kiyohara  * by spec.  uhub does this delay
   2762   1.12  kiyohara  *
   2763   1.12  kiyohara  * Started from root hub set feature reset, which does step one.
   2764   1.48     skrll  * ub_usepolling will call slhci_reset directly, otherwise the callout goes
   2765   1.12  kiyohara  * through slhci_reset_entry.
   2766   1.12  kiyohara  */
   2767   1.12  kiyohara void
   2768   1.12  kiyohara slhci_reset(struct slhci_softc *sc)
   2769    1.1     isaki {
   2770   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2771   1.12  kiyohara 	struct slhci_transfers *t;
   2772   1.27  kiyohara 	struct slhci_pipe *spipe;
   2773   1.27  kiyohara 	struct gcq *q;
   2774   1.12  kiyohara 	uint8_t r, pol, ctrl;
   2775    1.1     isaki 
   2776   1.12  kiyohara 	t = &sc->sc_transfers;
   2777   1.41     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2778    1.1     isaki 
   2779   1.12  kiyohara 	stop_cc_time(&t_delay);
   2780    1.1     isaki 
   2781   1.12  kiyohara 	KASSERT(t->flags & F_ACTIVE);
   2782    1.1     isaki 
   2783   1.12  kiyohara 	start_cc_time(&t_delay, 0);
   2784   1.12  kiyohara 	stop_cc_time(&t_delay);
   2785    1.1     isaki 
   2786   1.12  kiyohara 	slhci_write(sc, SL11_CTRL, 0);
   2787   1.12  kiyohara 	start_cc_time(&t_delay, 3);
   2788   1.12  kiyohara 	DELAY(3);
   2789   1.12  kiyohara 	stop_cc_time(&t_delay);
   2790   1.12  kiyohara 	slhci_write(sc, SL11_ISR, 0xff);
   2791    1.1     isaki 
   2792   1.12  kiyohara 	r = slhci_read(sc, SL11_ISR);
   2793    1.1     isaki 
   2794   1.12  kiyohara 	if (r & SL11_ISR_INSERT)
   2795   1.12  kiyohara 		slhci_write(sc, SL11_ISR, SL11_ISR_INSERT);
   2796    1.1     isaki 
   2797   1.12  kiyohara 	if (r & SL11_ISR_NODEV) {
   2798   1.12  kiyohara 		DLOG(D_MSG, "NC", 0,0,0,0);
   2799   1.34     skrll 		/*
   2800   1.34     skrll 		 * Normally, the hard interrupt insert routine will issue
   2801   1.37     skrll 		 * CCONNECT, however we need to do it here if the detach
   2802   1.34     skrll 		 * happened during reset.
   2803   1.34     skrll 		 */
   2804   1.12  kiyohara 		if (!(t->flags & F_NODEV))
   2805   1.12  kiyohara 			t->flags |= F_CCONNECT|F_ROOTINTR|F_NODEV;
   2806   1.12  kiyohara 		slhci_intrchange(sc, SL11_IER_INSERT);
   2807   1.12  kiyohara 	} else {
   2808   1.12  kiyohara 		if (t->flags & F_NODEV)
   2809   1.12  kiyohara 			t->flags |= F_CCONNECT;
   2810   1.12  kiyohara 		t->flags &= ~(F_NODEV|F_LOWSPEED);
   2811   1.12  kiyohara 		if (r & SL11_ISR_DATA) {
   2812   1.12  kiyohara 			DLOG(D_MSG, "FS", 0,0,0,0);
   2813   1.12  kiyohara 			pol = ctrl = 0;
   2814   1.12  kiyohara 		} else {
   2815   1.12  kiyohara 			DLOG(D_MSG, "LS", 0,0,0,0);
   2816   1.12  kiyohara 			pol  = SL811_CSOF_POLARITY;
   2817   1.12  kiyohara 			ctrl = SL11_CTRL_LOWSPEED;
   2818   1.12  kiyohara 			t->flags |= F_LOWSPEED;
   2819   1.12  kiyohara 		}
   2820    1.1     isaki 
   2821   1.12  kiyohara 		/* Enable SOF auto-generation */
   2822   1.12  kiyohara 		t->frame = 0;	/* write to SL811_CSOF will reset frame */
   2823   1.12  kiyohara 		slhci_write(sc, SL11_SOFTIME, 0xe0);
   2824   1.12  kiyohara 		slhci_write(sc, SL811_CSOF, pol|SL811_CSOF_MASTER|0x2e);
   2825   1.12  kiyohara 		slhci_write(sc, SL11_CTRL, ctrl|SL11_CTRL_ENABLESOF);
   2826   1.12  kiyohara 
   2827   1.34     skrll 		/*
   2828   1.34     skrll 		 * According to the app note, ARM must be set
   2829   1.37     skrll 		 * for SOF generation to work.  We initialize all
   2830   1.34     skrll 		 * USBA registers here for current_tregs.
   2831   1.34     skrll 		 */
   2832   1.12  kiyohara 		slhci_write(sc, SL11_E0ADDR, SL11_BUFFER_START);
   2833   1.12  kiyohara 		slhci_write(sc, SL11_E0LEN, 0);
   2834   1.12  kiyohara 		slhci_write(sc, SL11_E0PID, SL11_PID_SOF);
   2835   1.12  kiyohara 		slhci_write(sc, SL11_E0DEV, 0);
   2836   1.12  kiyohara 		slhci_write(sc, SL11_E0CTRL, SL11_EPCTRL_ARM);
   2837   1.12  kiyohara 
   2838   1.34     skrll 		/*
   2839   1.34     skrll 		 * Initialize B registers.  This can't be done earlier since
   2840   1.37     skrll 		 * they are not valid until the SL811_CSOF register is written
   2841  1.107    andvar 		 * above due to SL11H compatibility.
   2842   1.34     skrll 		 */
   2843   1.12  kiyohara 		slhci_write(sc, SL11_E1ADDR, SL11_BUFFER_END - 8);
   2844   1.12  kiyohara 		slhci_write(sc, SL11_E1LEN, 0);
   2845   1.12  kiyohara 		slhci_write(sc, SL11_E1PID, 0);
   2846   1.12  kiyohara 		slhci_write(sc, SL11_E1DEV, 0);
   2847   1.12  kiyohara 
   2848   1.12  kiyohara 		t->current_tregs[0][ADR] = SL11_BUFFER_START;
   2849   1.12  kiyohara 		t->current_tregs[0][LEN] = 0;
   2850   1.12  kiyohara 		t->current_tregs[0][PID] = SL11_PID_SOF;
   2851   1.12  kiyohara 		t->current_tregs[0][DEV] = 0;
   2852   1.12  kiyohara 		t->current_tregs[1][ADR] = SL11_BUFFER_END - 8;
   2853   1.12  kiyohara 		t->current_tregs[1][LEN] = 0;
   2854   1.12  kiyohara 		t->current_tregs[1][PID] = 0;
   2855   1.12  kiyohara 		t->current_tregs[1][DEV] = 0;
   2856   1.12  kiyohara 
   2857   1.12  kiyohara 		/* SOF start will produce USBA interrupt */
   2858   1.12  kiyohara 		t->len[A] = 0;
   2859   1.12  kiyohara 		t->flags |= F_AINPROG;
   2860   1.12  kiyohara 
   2861   1.12  kiyohara 		slhci_intrchange(sc, SLHCI_NORMAL_INTERRUPTS);
   2862   1.12  kiyohara 	}
   2863   1.12  kiyohara 
   2864   1.12  kiyohara 	t->flags &= ~(F_UDISABLED|F_RESET);
   2865   1.12  kiyohara 	t->flags |= F_CRESET|F_ROOTINTR;
   2866   1.27  kiyohara 	FOREACH_AP(q, t, spipe) {
   2867   1.27  kiyohara 		spipe->pflags &= ~PF_GONE;
   2868   1.48     skrll 		spipe->pipe.up_aborting = 0;
   2869   1.27  kiyohara 	}
   2870   1.98  pgoyette 	DLOG(D_MSG, "RESET done flags %#jx", t->flags, 0,0,0);
   2871    1.1     isaki }
   2872    1.1     isaki 
   2873   1.86     skrll 
   2874   1.86     skrll #ifdef SLHCI_DEBUG
   2875   1.86     skrll static int
   2876   1.86     skrll slhci_memtest(struct slhci_softc *sc)
   2877   1.86     skrll {
   2878   1.86     skrll 	enum { ASC, DESC, EITHER = ASC };	/* direction */
   2879   1.86     skrll 	enum { READ, WRITE };			/* operation */
   2880   1.86     skrll 	const char *ptr, *elem;
   2881   1.86     skrll 	size_t i;
   2882   1.86     skrll 	const int low = SL11_BUFFER_START, high = SL11_BUFFER_END;
   2883   1.86     skrll 	int addr = 0, dir = ASC, op = READ;
   2884   1.86     skrll 	/* Extended March C- test algorithm (SOFs also) */
   2885   1.86     skrll 	const char test[] = "E(w0) A(r0w1r1) A(r1w0r0) D(r0w1) D(r1w0) E(r0)";
   2886   1.86     skrll 	char c;
   2887   1.86     skrll 	const uint8_t dbs[] = { 0x00, 0x0f, 0x33, 0x55 }; /* data backgrounds */
   2888   1.86     skrll 	uint8_t db;
   2889   1.86     skrll 
   2890   1.86     skrll 	/* Perform memory test for all data backgrounds. */
   2891   1.86     skrll 	for (i = 0; i < __arraycount(dbs); i++) {
   2892   1.86     skrll 		ptr = test;
   2893   1.86     skrll 		elem = ptr;
   2894   1.86     skrll 		/* Walk test algorithm string. */
   2895   1.86     skrll 		while ((c = *ptr++) != '\0')
   2896   1.86     skrll 			switch (tolower((int)c)) {
   2897   1.86     skrll 			case 'a':
   2898   1.86     skrll 				/* Address sequence is in ascending order. */
   2899   1.86     skrll 				dir = ASC;
   2900   1.86     skrll 				break;
   2901   1.86     skrll 			case 'd':
   2902   1.86     skrll 				/* Address sequence is in descending order. */
   2903   1.86     skrll 				dir = DESC;
   2904   1.86     skrll 				break;
   2905   1.86     skrll 			case 'e':
   2906   1.86     skrll 				/* Address sequence is in either order. */
   2907   1.86     skrll 				dir = EITHER;
   2908   1.86     skrll 				break;
   2909   1.86     skrll 			case '(':
   2910   1.86     skrll 				/* Start of test element (sequence). */
   2911   1.86     skrll 				elem = ptr;
   2912   1.86     skrll 				addr = (dir == ASC) ? low : high;
   2913   1.86     skrll 				break;
   2914   1.86     skrll 			case 'r':
   2915   1.86     skrll 				/* read operation */
   2916   1.86     skrll 				op = READ;
   2917   1.86     skrll 				break;
   2918   1.86     skrll 			case 'w':
   2919   1.86     skrll 				/* write operation */
   2920   1.86     skrll 				op = WRITE;
   2921   1.86     skrll 				break;
   2922   1.86     skrll 			case '0':
   2923   1.86     skrll 			case '1':
   2924   1.86     skrll 				/*
   2925   1.86     skrll 				 * Execute previously set-up operation by
   2926   1.86     skrll 				 * reading/writing non-inverted ('0') or
   2927   1.86     skrll 				 * inverted ('1') data background.
   2928   1.86     skrll 				 */
   2929   1.86     skrll 				db = (c - '0') ? ~dbs[i] : dbs[i];
   2930   1.86     skrll 				if (op == READ) {
   2931   1.86     skrll 					if (slhci_read(sc, addr) != db)
   2932   1.86     skrll 						return -1;
   2933   1.86     skrll 				} else
   2934   1.86     skrll 					slhci_write(sc, addr, db);
   2935   1.86     skrll 				break;
   2936   1.86     skrll 			case ')':
   2937   1.86     skrll 				/*
   2938   1.86     skrll 				 * End of element: Repeat same element with next
   2939   1.86     skrll 				 * address or continue to next element.
   2940   1.86     skrll 				 */
   2941   1.86     skrll 				addr = (dir == ASC) ? addr + 1 : addr - 1;
   2942   1.86     skrll 				if (addr >= low && addr <= high)
   2943   1.86     skrll 					ptr = elem;
   2944   1.86     skrll 				break;
   2945   1.86     skrll 			default:
   2946   1.86     skrll 				/* Do nothing. */
   2947   1.86     skrll 				break;
   2948   1.86     skrll 			}
   2949   1.86     skrll 	}
   2950   1.86     skrll 
   2951   1.86     skrll 	return 0;
   2952   1.86     skrll }
   2953   1.86     skrll #endif
   2954   1.86     skrll 
   2955   1.12  kiyohara /* returns 1 if succeeded, 0 if failed, reserve == 0 is unreserve */
   2956   1.12  kiyohara static int
   2957   1.37     skrll slhci_reserve_bustime(struct slhci_softc *sc, struct slhci_pipe *spipe, int
   2958   1.12  kiyohara     reserve)
   2959    1.1     isaki {
   2960   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   2961   1.12  kiyohara 	struct slhci_transfers *t;
   2962   1.12  kiyohara 	int bustime, max_packet;
   2963   1.12  kiyohara 
   2964   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   2965   1.12  kiyohara 
   2966   1.12  kiyohara 	t = &sc->sc_transfers;
   2967   1.48     skrll 	max_packet = UGETW(spipe->pipe.up_endpoint->ue_edesc->wMaxPacketSize);
   2968   1.12  kiyohara 
   2969   1.12  kiyohara 	if (spipe->pflags & PF_LS)
   2970   1.12  kiyohara 		bustime = SLHCI_LS_CONST + SLHCI_LS_DATA_TIME(max_packet);
   2971   1.12  kiyohara 	else
   2972   1.12  kiyohara 		bustime = SLHCI_FS_CONST + SLHCI_FS_DATA_TIME(max_packet);
   2973    1.1     isaki 
   2974   1.12  kiyohara 	if (!reserve) {
   2975   1.12  kiyohara 		t->reserved_bustime -= bustime;
   2976   1.12  kiyohara #ifdef DIAGNOSTIC
   2977   1.12  kiyohara 		if (t->reserved_bustime < 0) {
   2978   1.37     skrll 			printf("%s: reserved_bustime %d < 0!\n",
   2979   1.12  kiyohara 			    SC_NAME(sc), t->reserved_bustime);
   2980   1.79     skrll 			DDOLOG("reserved_bustime %d < 0!",
   2981   1.79     skrll 			    t->reserved_bustime, 0, 0, 0);
   2982   1.12  kiyohara 			t->reserved_bustime = 0;
   2983   1.12  kiyohara 		}
   2984   1.12  kiyohara #endif
   2985   1.12  kiyohara 		return 1;
   2986   1.12  kiyohara 	}
   2987    1.1     isaki 
   2988   1.12  kiyohara 	if (t->reserved_bustime + bustime > SLHCI_RESERVED_BUSTIME) {
   2989   1.37     skrll 		if (ratecheck(&sc->sc_reserved_warn_rate,
   2990   1.12  kiyohara 		    &reserved_warn_rate))
   2991   1.12  kiyohara #ifdef SLHCI_NO_OVERTIME
   2992   1.12  kiyohara 		{
   2993   1.12  kiyohara 			printf("%s: Max reserved bus time exceeded! "
   2994   1.12  kiyohara 			    "Erroring request.\n", SC_NAME(sc));
   2995   1.12  kiyohara 			DDOLOG("%s: Max reserved bus time exceeded! "
   2996   1.79     skrll 			    "Erroring request.", 0, 0, 0, 0);
   2997   1.12  kiyohara 		}
   2998   1.12  kiyohara 		return 0;
   2999   1.12  kiyohara #else
   3000   1.12  kiyohara 		{
   3001   1.37     skrll 			printf("%s: Reserved bus time exceeds %d!\n",
   3002   1.12  kiyohara 			    SC_NAME(sc), SLHCI_RESERVED_BUSTIME);
   3003   1.79     skrll 			DDOLOG("Reserved bus time exceeds %d!",
   3004   1.79     skrll 			    SLHCI_RESERVED_BUSTIME, 0, 0, 0);
   3005   1.12  kiyohara 		}
   3006   1.12  kiyohara #endif
   3007    1.1     isaki 	}
   3008    1.1     isaki 
   3009   1.12  kiyohara 	t->reserved_bustime += bustime;
   3010   1.12  kiyohara 	return 1;
   3011    1.1     isaki }
   3012    1.1     isaki 
   3013   1.12  kiyohara /* Device insertion/removal interrupt */
   3014    1.1     isaki static void
   3015   1.12  kiyohara slhci_insert(struct slhci_softc *sc)
   3016    1.1     isaki {
   3017   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3018   1.12  kiyohara 	struct slhci_transfers *t;
   3019   1.12  kiyohara 
   3020   1.12  kiyohara 	t = &sc->sc_transfers;
   3021    1.1     isaki 
   3022   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   3023    1.1     isaki 
   3024   1.12  kiyohara 	if (t->flags & F_NODEV)
   3025   1.12  kiyohara 		slhci_intrchange(sc, 0);
   3026   1.12  kiyohara 	else {
   3027   1.12  kiyohara 		slhci_drain(sc);
   3028   1.12  kiyohara 		slhci_intrchange(sc, SL11_IER_INSERT);
   3029    1.1     isaki 	}
   3030   1.12  kiyohara 	t->flags ^= F_NODEV;
   3031   1.12  kiyohara 	t->flags |= F_ROOTINTR|F_CCONNECT;
   3032   1.98  pgoyette 	DLOG(D_MSG, "INSERT intr: flags after %#jx", t->flags, 0,0,0);
   3033    1.1     isaki }
   3034    1.1     isaki 
   3035   1.12  kiyohara /*
   3036   1.12  kiyohara  * Data structures and routines to emulate the root hub.
   3037   1.12  kiyohara  */
   3038   1.12  kiyohara 
   3039    1.1     isaki static usbd_status
   3040   1.12  kiyohara slhci_clear_feature(struct slhci_softc *sc, unsigned int what)
   3041    1.1     isaki {
   3042   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3043   1.12  kiyohara 	struct slhci_transfers *t;
   3044   1.12  kiyohara 	usbd_status error;
   3045    1.1     isaki 
   3046   1.12  kiyohara 	t = &sc->sc_transfers;
   3047   1.12  kiyohara 	error = USBD_NORMAL_COMPLETION;
   3048    1.1     isaki 
   3049   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   3050    1.1     isaki 
   3051   1.12  kiyohara 	if (what == UHF_PORT_POWER) {
   3052   1.12  kiyohara 		DLOG(D_MSG, "POWER_OFF", 0,0,0,0);
   3053   1.12  kiyohara 		t->flags &= ~F_POWER;
   3054   1.12  kiyohara 		if (!(t->flags & F_NODEV))
   3055   1.12  kiyohara 			t->flags |= F_NODEV|F_CCONNECT|F_ROOTINTR;
   3056   1.12  kiyohara 		/* for x68k Nereid USB controller */
   3057   1.12  kiyohara 		if (sc->sc_enable_power && (t->flags & F_REALPOWER)) {
   3058   1.12  kiyohara 			t->flags &= ~F_REALPOWER;
   3059   1.12  kiyohara 			sc->sc_enable_power(sc, POWER_OFF);
   3060   1.12  kiyohara 		}
   3061   1.12  kiyohara 		slhci_intrchange(sc, 0);
   3062   1.37     skrll 		slhci_drain(sc);
   3063   1.12  kiyohara 	} else if (what == UHF_C_PORT_CONNECTION) {
   3064   1.12  kiyohara 		t->flags &= ~F_CCONNECT;
   3065   1.12  kiyohara 	} else if (what == UHF_C_PORT_RESET) {
   3066   1.12  kiyohara 		t->flags &= ~F_CRESET;
   3067   1.12  kiyohara 	} else if (what == UHF_PORT_ENABLE) {
   3068   1.12  kiyohara 		slhci_drain(sc);
   3069   1.12  kiyohara 	} else if (what != UHF_PORT_SUSPEND) {
   3070   1.12  kiyohara 		DDOLOG("ClrPortFeatERR:value=%#.4x", what, 0,0,0);
   3071   1.12  kiyohara 		error = USBD_IOERROR;
   3072   1.12  kiyohara 	}
   3073    1.1     isaki 
   3074   1.12  kiyohara 	return error;
   3075    1.1     isaki }
   3076    1.1     isaki 
   3077    1.1     isaki static usbd_status
   3078   1.12  kiyohara slhci_set_feature(struct slhci_softc *sc, unsigned int what)
   3079    1.1     isaki {
   3080   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3081   1.12  kiyohara 	struct slhci_transfers *t;
   3082   1.12  kiyohara 	uint8_t r;
   3083   1.12  kiyohara 
   3084   1.12  kiyohara 	t = &sc->sc_transfers;
   3085   1.12  kiyohara 
   3086   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   3087   1.12  kiyohara 
   3088   1.12  kiyohara 	if (what == UHF_PORT_RESET) {
   3089   1.12  kiyohara 		if (!(t->flags & F_ACTIVE)) {
   3090   1.37     skrll 			DDOLOG("SET PORT_RESET when not ACTIVE!",
   3091   1.12  kiyohara 			    0,0,0,0);
   3092   1.12  kiyohara 			return USBD_INVAL;
   3093   1.12  kiyohara 		}
   3094   1.12  kiyohara 		if (!(t->flags & F_POWER)) {
   3095   1.12  kiyohara 			DDOLOG("SET PORT_RESET without PORT_POWER! flags %p",
   3096   1.12  kiyohara 			    t->flags, 0,0,0);
   3097   1.12  kiyohara 			return USBD_INVAL;
   3098   1.12  kiyohara 		}
   3099   1.12  kiyohara 		if (t->flags & F_RESET)
   3100   1.12  kiyohara 			return USBD_NORMAL_COMPLETION;
   3101   1.98  pgoyette 		DLOG(D_MSG, "RESET flags %#jx", t->flags, 0,0,0);
   3102   1.12  kiyohara 		slhci_intrchange(sc, 0);
   3103   1.37     skrll 		slhci_drain(sc);
   3104   1.12  kiyohara 		slhci_write(sc, SL11_CTRL, SL11_CTRL_RESETENGINE);
   3105   1.12  kiyohara 		/* usb spec says delay >= 10ms, app note 50ms */
   3106   1.12  kiyohara  		start_cc_time(&t_delay, 50000);
   3107   1.48     skrll 		if (sc->sc_bus.ub_usepolling) {
   3108   1.12  kiyohara 			DELAY(50000);
   3109   1.12  kiyohara 			slhci_reset(sc);
   3110   1.12  kiyohara 		} else {
   3111   1.12  kiyohara 			t->flags |= F_RESET;
   3112  1.100  riastrad 			callout_schedule(&sc->sc_timer, uimax(mstohz(50), 2));
   3113   1.12  kiyohara 		}
   3114   1.12  kiyohara 	} else if (what == UHF_PORT_SUSPEND) {
   3115   1.12  kiyohara 		printf("%s: USB Suspend not implemented!\n", SC_NAME(sc));
   3116   1.79     skrll 		DDOLOG("USB Suspend not implemented!", 0, 0, 0, 0);
   3117   1.12  kiyohara 	} else if (what == UHF_PORT_POWER) {
   3118   1.12  kiyohara 		DLOG(D_MSG, "PORT_POWER", 0,0,0,0);
   3119   1.12  kiyohara 		/* for x68k Nereid USB controller */
   3120   1.12  kiyohara 		if (!(t->flags & F_ACTIVE))
   3121   1.12  kiyohara 			return USBD_INVAL;
   3122   1.12  kiyohara 		if (t->flags & F_POWER)
   3123   1.12  kiyohara 			return USBD_NORMAL_COMPLETION;
   3124   1.12  kiyohara 		if (!(t->flags & F_REALPOWER)) {
   3125   1.12  kiyohara 			if (sc->sc_enable_power)
   3126   1.12  kiyohara 				sc->sc_enable_power(sc, POWER_ON);
   3127   1.12  kiyohara 			t->flags |= F_REALPOWER;
   3128   1.12  kiyohara 		}
   3129   1.12  kiyohara 		t->flags |= F_POWER;
   3130   1.12  kiyohara 		r = slhci_read(sc, SL11_ISR);
   3131   1.12  kiyohara 		if (r & SL11_ISR_INSERT)
   3132   1.12  kiyohara 			slhci_write(sc, SL11_ISR, SL11_ISR_INSERT);
   3133   1.12  kiyohara 		if (r & SL11_ISR_NODEV) {
   3134   1.12  kiyohara 			slhci_intrchange(sc, SL11_IER_INSERT);
   3135   1.12  kiyohara 			t->flags |= F_NODEV;
   3136   1.12  kiyohara 		} else {
   3137   1.12  kiyohara 			t->flags &= ~F_NODEV;
   3138   1.12  kiyohara 			t->flags |= F_CCONNECT|F_ROOTINTR;
   3139   1.12  kiyohara 		}
   3140   1.12  kiyohara 	} else {
   3141   1.12  kiyohara 		DDOLOG("SetPortFeatERR=%#.8x", what, 0,0,0);
   3142   1.12  kiyohara 		return USBD_IOERROR;
   3143   1.12  kiyohara 	}
   3144    1.1     isaki 
   3145    1.1     isaki 	return USBD_NORMAL_COMPLETION;
   3146    1.1     isaki }
   3147    1.1     isaki 
   3148    1.1     isaki static void
   3149   1.12  kiyohara slhci_get_status(struct slhci_softc *sc, usb_port_status_t *ps)
   3150    1.1     isaki {
   3151   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3152   1.12  kiyohara 	struct slhci_transfers *t;
   3153   1.12  kiyohara 	unsigned int status, change;
   3154   1.12  kiyohara 
   3155   1.12  kiyohara 	t = &sc->sc_transfers;
   3156   1.12  kiyohara 
   3157   1.44     skrll 	KASSERT(mutex_owned(&sc->sc_intr_lock));
   3158    1.1     isaki 
   3159   1.34     skrll 	/*
   3160   1.71     skrll 	 * We do not have a way to detect over current or babble and
   3161   1.37     skrll 	 * suspend is currently not implemented, so connect and reset
   3162   1.34     skrll 	 * are the only changes that need to be reported.
   3163   1.34     skrll 	 */
   3164   1.12  kiyohara 	change = 0;
   3165   1.12  kiyohara 	if (t->flags & F_CCONNECT)
   3166   1.12  kiyohara 		change |= UPS_C_CONNECT_STATUS;
   3167   1.12  kiyohara 	if (t->flags & F_CRESET)
   3168   1.12  kiyohara 		change |= UPS_C_PORT_RESET;
   3169   1.12  kiyohara 
   3170   1.12  kiyohara 	status = 0;
   3171   1.12  kiyohara 	if (!(t->flags & F_NODEV))
   3172   1.12  kiyohara 		status |= UPS_CURRENT_CONNECT_STATUS;
   3173   1.12  kiyohara 	if (!(t->flags & F_UDISABLED))
   3174   1.12  kiyohara 		status |= UPS_PORT_ENABLED;
   3175   1.12  kiyohara 	if (t->flags & F_RESET)
   3176   1.12  kiyohara 		status |= UPS_RESET;
   3177   1.12  kiyohara 	if (t->flags & F_POWER)
   3178   1.12  kiyohara 		status |= UPS_PORT_POWER;
   3179   1.12  kiyohara 	if (t->flags & F_LOWSPEED)
   3180   1.12  kiyohara 		status |= UPS_LOW_SPEED;
   3181   1.37     skrll 	USETW(ps->wPortStatus, status);
   3182   1.12  kiyohara 	USETW(ps->wPortChange, change);
   3183   1.98  pgoyette 	DLOG(D_ROOT, "status=%#.4jx, change=%#.4jx", status, change, 0,0);
   3184    1.1     isaki }
   3185    1.1     isaki 
   3186   1.48     skrll static int
   3187   1.48     skrll slhci_roothub_ctrl(struct usbd_bus *bus, usb_device_request_t *req,
   3188   1.48     skrll     void *buf, int buflen)
   3189   1.48     skrll {
   3190   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3191   1.48     skrll 	struct slhci_softc *sc = SLHCI_BUS2SC(bus);
   3192   1.48     skrll 	struct slhci_transfers *t = &sc->sc_transfers;
   3193   1.48     skrll 	usbd_status error = USBD_IOERROR; /* XXX should be STALL */
   3194   1.48     skrll 	uint16_t len, value, index;
   3195   1.48     skrll 	uint8_t type;
   3196   1.48     skrll 	int actlen = 0;
   3197   1.12  kiyohara 
   3198   1.12  kiyohara 	len = UGETW(req->wLength);
   3199   1.12  kiyohara 	value = UGETW(req->wValue);
   3200   1.12  kiyohara 	index = UGETW(req->wIndex);
   3201    1.1     isaki 
   3202   1.37     skrll 	type = req->bmRequestType;
   3203    1.1     isaki 
   3204   1.79     skrll 	SLHCI_DEXEC(D_TRACE, slhci_log_req(req));
   3205    1.1     isaki 
   3206   1.12  kiyohara 	/*
   3207   1.12  kiyohara 	 * USB requests for hubs have two basic types, standard and class.
   3208   1.37     skrll 	 * Each could potentially have recipients of device, interface,
   3209   1.12  kiyohara 	 * endpoint, or other.  For the hub class, CLASS_OTHER means the port
   3210   1.12  kiyohara 	 * and CLASS_DEVICE means the hub.  For standard requests, OTHER
   3211   1.37     skrll 	 * is not used.  Standard request are described in section 9.4 of the
   3212   1.37     skrll 	 * standard, hub class requests in 11.16.  Each request is either read
   3213   1.12  kiyohara 	 * or write.
   3214   1.12  kiyohara 	 *
   3215   1.37     skrll 	 * Clear Feature, Set Feature, and Status are defined for each of the
   3216   1.37     skrll 	 * used recipients.  Get Descriptor and Set Descriptor are defined for
   3217   1.37     skrll 	 * both standard and hub class types with different descriptors.
   3218   1.37     skrll 	 * Other requests have only one defined recipient and type.  These
   3219   1.37     skrll 	 * include: Get/Set Address, Get/Set Configuration, Get/Set Interface,
   3220   1.37     skrll 	 * and Synch Frame for standard requests and Get Bus State for hub
   3221   1.12  kiyohara 	 * class.
   3222   1.12  kiyohara 	 *
   3223   1.37     skrll 	 * When a device is first powered up it has address 0 until the
   3224   1.12  kiyohara 	 * address is set.
   3225   1.37     skrll 	 *
   3226   1.37     skrll 	 * Hubs are only allowed to support one interface and may not have
   3227   1.37     skrll 	 * isochronous endpoints.  The results of the related requests are
   3228   1.12  kiyohara 	 * undefined.
   3229   1.12  kiyohara 	 *
   3230   1.37     skrll 	 * The standard requires invalid or unsupported requests to return
   3231   1.37     skrll 	 * STALL in the data stage, however this does not work well with
   3232   1.12  kiyohara 	 * current error handling. XXX
   3233   1.12  kiyohara 	 *
   3234   1.12  kiyohara 	 * Some unsupported fields:
   3235   1.12  kiyohara 	 * Clear Hub Feature is for C_HUB_LOCAL_POWER and C_HUB_OVER_CURRENT
   3236   1.12  kiyohara 	 * Set Device Features is for ENDPOINT_HALT and DEVICE_REMOTE_WAKEUP
   3237   1.12  kiyohara 	 * Get Bus State is optional sample of D- and D+ at EOF2
   3238   1.12  kiyohara 	 */
   3239    1.1     isaki 
   3240   1.12  kiyohara 	switch (req->bRequest) {
   3241   1.12  kiyohara 	/* Write Requests */
   3242   1.12  kiyohara 	case UR_CLEAR_FEATURE:
   3243   1.12  kiyohara 		if (type == UT_WRITE_CLASS_OTHER) {
   3244   1.69     skrll 			if (index == 1 /* Port */) {
   3245   1.69     skrll 				mutex_enter(&sc->sc_intr_lock);
   3246   1.12  kiyohara 				error = slhci_clear_feature(sc, value);
   3247   1.69     skrll 				mutex_exit(&sc->sc_intr_lock);
   3248   1.69     skrll 			} else
   3249   1.12  kiyohara 				DLOG(D_ROOT, "Clear Port Feature "
   3250   1.98  pgoyette 				    "index = %#.4jx", index, 0,0,0);
   3251   1.12  kiyohara 		}
   3252   1.12  kiyohara 		break;
   3253   1.12  kiyohara 	case UR_SET_FEATURE:
   3254   1.12  kiyohara 		if (type == UT_WRITE_CLASS_OTHER) {
   3255   1.68     skrll 			if (index == 1 /* Port */) {
   3256   1.68     skrll 				mutex_enter(&sc->sc_intr_lock);
   3257   1.12  kiyohara 				error = slhci_set_feature(sc, value);
   3258   1.68     skrll 				mutex_exit(&sc->sc_intr_lock);
   3259   1.68     skrll 			} else
   3260   1.12  kiyohara 				DLOG(D_ROOT, "Set Port Feature "
   3261   1.98  pgoyette 				    "index = %#.4jx", index, 0,0,0);
   3262   1.12  kiyohara 		} else if (type != UT_WRITE_CLASS_DEVICE)
   3263   1.12  kiyohara 			DLOG(D_ROOT, "Set Device Feature "
   3264   1.12  kiyohara 			    "ENDPOINT_HALT or DEVICE_REMOTE_WAKEUP "
   3265   1.12  kiyohara 			    "not supported", 0,0,0,0);
   3266   1.12  kiyohara 		break;
   3267   1.48     skrll 
   3268   1.12  kiyohara 	/* Read Requests */
   3269   1.12  kiyohara 	case UR_GET_STATUS:
   3270   1.12  kiyohara 		if (type == UT_READ_CLASS_OTHER) {
   3271   1.12  kiyohara 			if (index == 1 /* Port */ && len == /* XXX >=? */
   3272   1.12  kiyohara 			    sizeof(usb_port_status_t)) {
   3273   1.68     skrll 				mutex_enter(&sc->sc_intr_lock);
   3274   1.12  kiyohara 				slhci_get_status(sc, (usb_port_status_t *)
   3275   1.12  kiyohara 				    buf);
   3276   1.68     skrll 				mutex_exit(&sc->sc_intr_lock);
   3277   1.12  kiyohara 				actlen = sizeof(usb_port_status_t);
   3278   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3279   1.37     skrll 			} else
   3280   1.98  pgoyette 				DLOG(D_ROOT, "Get Port Status index = %#.4jx "
   3281   1.98  pgoyette 				    "len = %#.4jx", index, len, 0,0);
   3282   1.12  kiyohara 		} else if (type == UT_READ_CLASS_DEVICE) { /* XXX index? */
   3283   1.12  kiyohara 			if (len == sizeof(usb_hub_status_t)) {
   3284   1.37     skrll 				DLOG(D_ROOT, "Get Hub Status",
   3285   1.12  kiyohara 				    0,0,0,0);
   3286   1.12  kiyohara 				actlen = sizeof(usb_hub_status_t);
   3287   1.12  kiyohara 				memset(buf, 0, actlen);
   3288   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3289   1.12  kiyohara 			} else
   3290   1.98  pgoyette 				DLOG(D_ROOT, "Get Hub Status bad len %#.4jx",
   3291   1.12  kiyohara 				    len, 0,0,0);
   3292   1.12  kiyohara 		}
   3293   1.12  kiyohara 		break;
   3294   1.12  kiyohara 	case UR_GET_DESCRIPTOR:
   3295   1.12  kiyohara 		if (type == UT_READ_DEVICE) {
   3296   1.12  kiyohara 			/* value is type (&0xff00) and index (0xff) */
   3297   1.12  kiyohara 			if (value == (UDESC_DEVICE<<8)) {
   3298   1.99  jakllsch 				actlen = buflen;
   3299   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3300   1.12  kiyohara 			} else if (value == (UDESC_CONFIG<<8)) {
   3301   1.48     skrll 				struct usb_roothub_descriptors confd;
   3302   1.48     skrll 
   3303  1.100  riastrad 				actlen = uimin(buflen, sizeof(confd));
   3304   1.48     skrll 				memcpy(&confd, buf, actlen);
   3305   1.48     skrll 
   3306   1.48     skrll 				/* 2 mA units */
   3307   1.48     skrll 				confd.urh_confd.bMaxPower = t->max_current;
   3308   1.48     skrll 				memcpy(buf, &confd, actlen);
   3309   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3310   1.12  kiyohara 			} else if (value == ((UDESC_STRING<<8)|1)) {
   3311   1.12  kiyohara 				/* Vendor */
   3312   1.99  jakllsch 				actlen = buflen;
   3313   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3314   1.12  kiyohara 			} else if (value == ((UDESC_STRING<<8)|2)) {
   3315   1.12  kiyohara 				/* Product */
   3316   1.20     isaki 				actlen = usb_makestrdesc((usb_string_descriptor_t *)
   3317   1.12  kiyohara 				    buf, len, "SL811HS/T root hub");
   3318   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3319   1.12  kiyohara 			} else
   3320   1.12  kiyohara 				DDOLOG("Unknown Get Descriptor %#.4x",
   3321   1.12  kiyohara 				    value, 0,0,0);
   3322   1.12  kiyohara 		} else if (type == UT_READ_CLASS_DEVICE) {
   3323   1.12  kiyohara 			/* Descriptor number is 0 */
   3324   1.12  kiyohara 			if (value == (UDESC_HUB<<8)) {
   3325   1.48     skrll 				usb_hub_descriptor_t hubd;
   3326   1.48     skrll 
   3327  1.100  riastrad 				actlen = uimin(buflen, sizeof(hubd));
   3328   1.48     skrll 				memcpy(&hubd, buf, actlen);
   3329   1.48     skrll 				hubd.bHubContrCurrent =
   3330   1.48     skrll 				    500 - t->max_current;
   3331   1.48     skrll 				memcpy(buf, &hubd, actlen);
   3332   1.12  kiyohara 				error = USBD_NORMAL_COMPLETION;
   3333   1.12  kiyohara 			} else
   3334   1.12  kiyohara 				DDOLOG("Unknown Get Hub Descriptor %#.4x",
   3335   1.12  kiyohara 				    value, 0,0,0);
   3336   1.12  kiyohara 		}
   3337   1.12  kiyohara 		break;
   3338   1.48     skrll 	default:
   3339   1.48     skrll 		/* default from usbroothub */
   3340   1.48     skrll 		return buflen;
   3341    1.1     isaki 	}
   3342    1.1     isaki 
   3343   1.12  kiyohara 	if (error == USBD_NORMAL_COMPLETION)
   3344   1.48     skrll 		return actlen;
   3345   1.12  kiyohara 
   3346   1.48     skrll 	return -1;
   3347    1.1     isaki }
   3348    1.1     isaki 
   3349   1.12  kiyohara /* End in lock functions. Start debug functions. */
   3350   1.12  kiyohara 
   3351   1.12  kiyohara #ifdef SLHCI_DEBUG
   3352    1.1     isaki void
   3353   1.12  kiyohara slhci_log_buffer(struct usbd_xfer *xfer)
   3354    1.1     isaki {
   3355   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3356   1.12  kiyohara 	u_char *buf;
   3357    1.1     isaki 
   3358   1.48     skrll 	if(xfer->ux_length > 0 &&
   3359   1.48     skrll 	    UE_GET_DIR(xfer->ux_pipe->up_endpoint->ue_edesc->bEndpointAddress) ==
   3360   1.12  kiyohara 	    UE_DIR_IN) {
   3361   1.48     skrll 		buf = xfer->ux_buf;
   3362   1.48     skrll 		DDOLOGBUF(buf, xfer->ux_actlen);
   3363   1.48     skrll 		DDOLOG("len %d actlen %d short %d", xfer->ux_length,
   3364   1.48     skrll 		    xfer->ux_actlen, xfer->ux_length - xfer->ux_actlen, 0);
   3365   1.12  kiyohara 	}
   3366    1.1     isaki }
   3367    1.1     isaki 
   3368    1.1     isaki void
   3369   1.12  kiyohara slhci_log_req(usb_device_request_t *r)
   3370    1.1     isaki {
   3371   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3372   1.79     skrll 	int req, type, value, index, len;
   3373    1.1     isaki 
   3374    1.1     isaki 	req   = r->bRequest;
   3375    1.1     isaki 	type  = r->bmRequestType;
   3376    1.1     isaki 	value = UGETW(r->wValue);
   3377    1.1     isaki 	index = UGETW(r->wIndex);
   3378    1.1     isaki 	len   = UGETW(r->wLength);
   3379    1.1     isaki 
   3380   1.79     skrll 	DDOLOG("request: type %#x", type, 0, 0, 0);
   3381   1.12  kiyohara 	DDOLOG("request: r=%d,v=%d,i=%d,l=%d ", req, value, index, len);
   3382    1.1     isaki }
   3383    1.1     isaki 
   3384    1.1     isaki void
   3385   1.12  kiyohara slhci_log_dumpreg(void)
   3386    1.1     isaki {
   3387   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3388   1.12  kiyohara 	uint8_t r;
   3389   1.12  kiyohara 	unsigned int aaddr, alen, baddr, blen;
   3390   1.12  kiyohara 	static u_char buf[240];
   3391   1.12  kiyohara 
   3392   1.12  kiyohara 	r = slhci_read(ssc, SL11_E0CTRL);
   3393   1.79     skrll 	DDOLOG("USB A Host Control = %#.2x", r, 0, 0, 0);
   3394   1.84     skrll 	DDOLOGEPCTRL(r);
   3395   1.79     skrll 
   3396   1.12  kiyohara 	aaddr = slhci_read(ssc, SL11_E0ADDR);
   3397   1.12  kiyohara 	DDOLOG("USB A Base Address = %u", aaddr, 0,0,0);
   3398   1.12  kiyohara 	alen = slhci_read(ssc, SL11_E0LEN);
   3399   1.12  kiyohara 	DDOLOG("USB A Length = %u", alen, 0,0,0);
   3400   1.12  kiyohara 	r = slhci_read(ssc, SL11_E0STAT);
   3401   1.12  kiyohara 	DDOLOG("USB A Status = %#.2x", r, 0,0,0);
   3402   1.84     skrll 	DDOLOGEPSTAT(r);
   3403   1.79     skrll 
   3404   1.12  kiyohara 	r = slhci_read(ssc, SL11_E0CONT);
   3405   1.12  kiyohara 	DDOLOG("USB A Remaining or Overflow Length = %u", r, 0,0,0);
   3406   1.12  kiyohara 	r = slhci_read(ssc, SL11_E1CTRL);
   3407   1.12  kiyohara 	DDOLOG("USB B Host Control = %#.2x", r, 0,0,0);
   3408   1.84     skrll 	DDOLOGEPCTRL(r);
   3409   1.79     skrll 
   3410   1.12  kiyohara 	baddr = slhci_read(ssc, SL11_E1ADDR);
   3411   1.12  kiyohara 	DDOLOG("USB B Base Address = %u", baddr, 0,0,0);
   3412   1.12  kiyohara 	blen = slhci_read(ssc, SL11_E1LEN);
   3413   1.12  kiyohara 	DDOLOG("USB B Length = %u", blen, 0,0,0);
   3414   1.12  kiyohara 	r = slhci_read(ssc, SL11_E1STAT);
   3415   1.12  kiyohara 	DDOLOG("USB B Status = %#.2x", r, 0,0,0);
   3416   1.84     skrll 	DDOLOGEPSTAT(r);
   3417   1.79     skrll 
   3418   1.12  kiyohara 	r = slhci_read(ssc, SL11_E1CONT);
   3419   1.12  kiyohara 	DDOLOG("USB B Remaining or Overflow Length = %u", r, 0,0,0);
   3420   1.12  kiyohara 
   3421   1.12  kiyohara 	r = slhci_read(ssc, SL11_CTRL);
   3422   1.12  kiyohara 	DDOLOG("Control = %#.2x", r, 0,0,0);
   3423   1.79     skrll 	DDOLOGCTRL(r);
   3424   1.79     skrll 
   3425   1.12  kiyohara 	r = slhci_read(ssc, SL11_IER);
   3426   1.12  kiyohara 	DDOLOG("Interrupt Enable = %#.2x", r, 0,0,0);
   3427   1.79     skrll 	DDOLOGIER(r);
   3428   1.79     skrll 
   3429   1.12  kiyohara 	r = slhci_read(ssc, SL11_ISR);
   3430   1.12  kiyohara 	DDOLOG("Interrupt Status = %#.2x", r, 0,0,0);
   3431   1.79     skrll 	DDOLOGISR(r);
   3432   1.79     skrll 
   3433   1.12  kiyohara 	r = slhci_read(ssc, SL11_REV);
   3434   1.12  kiyohara 	DDOLOG("Revision = %#.2x", r, 0,0,0);
   3435   1.12  kiyohara 	r = slhci_read(ssc, SL811_CSOF);
   3436   1.12  kiyohara 	DDOLOG("SOF Counter = %#.2x", r, 0,0,0);
   3437   1.12  kiyohara 
   3438   1.37     skrll 	if (alen && aaddr >= SL11_BUFFER_START && aaddr < SL11_BUFFER_END &&
   3439   1.12  kiyohara 	    alen <= SL11_MAX_PACKET_SIZE && aaddr + alen <= SL11_BUFFER_END) {
   3440   1.12  kiyohara 		slhci_read_multi(ssc, aaddr, buf, alen);
   3441   1.12  kiyohara 		DDOLOG("USBA Buffer: start %u len %u", aaddr, alen, 0,0);
   3442   1.12  kiyohara 		DDOLOGBUF(buf, alen);
   3443   1.12  kiyohara 	} else if (alen)
   3444   1.12  kiyohara 		DDOLOG("USBA Buffer Invalid", 0,0,0,0);
   3445   1.12  kiyohara 
   3446   1.37     skrll 	if (blen && baddr >= SL11_BUFFER_START && baddr < SL11_BUFFER_END &&
   3447   1.12  kiyohara 	    blen <= SL11_MAX_PACKET_SIZE && baddr + blen <= SL11_BUFFER_END) {
   3448   1.12  kiyohara 		slhci_read_multi(ssc, baddr, buf, blen);
   3449   1.12  kiyohara 		DDOLOG("USBB Buffer: start %u len %u", baddr, blen, 0,0);
   3450   1.12  kiyohara 		DDOLOGBUF(buf, blen);
   3451   1.12  kiyohara 	} else if (blen)
   3452   1.12  kiyohara 		DDOLOG("USBB Buffer Invalid", 0,0,0,0);
   3453    1.1     isaki }
   3454    1.1     isaki 
   3455    1.1     isaki void
   3456   1.12  kiyohara slhci_log_xfer(struct usbd_xfer *xfer)
   3457    1.1     isaki {
   3458   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3459   1.12  kiyohara 	DDOLOG("xfer: length=%u, actlen=%u, flags=%#x, timeout=%u,",
   3460   1.48     skrll 		xfer->ux_length, xfer->ux_actlen, xfer->ux_flags, xfer->ux_timeout);
   3461   1.56     skrll 	DDOLOG("buffer=%p", xfer->ux_buf, 0,0,0);
   3462   1.79     skrll 	slhci_log_req(&xfer->ux_request);
   3463   1.12  kiyohara }
   3464   1.12  kiyohara 
   3465   1.12  kiyohara void
   3466   1.12  kiyohara slhci_log_spipe(struct slhci_pipe *spipe)
   3467   1.12  kiyohara {
   3468   1.56     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3469   1.79     skrll 	DDOLOG("spipe %p onlists: AP=%d TO=%d XQ=%d", spipe,
   3470   1.79     skrll 	    gcq_onlist(&spipe->ap) ? 1 : 0,
   3471   1.79     skrll 	    gcq_onlist(&spipe->to) ? 1 : 0,
   3472   1.79     skrll 	    gcq_onlist(&spipe->xq) ? 1 : 0);
   3473   1.79     skrll 	DDOLOG("spipe: xfer %p buffer %p pflags %#x ptype %d",
   3474   1.79     skrll 	    spipe->xfer, spipe->buffer, spipe->pflags, spipe->ptype);
   3475   1.12  kiyohara }
   3476   1.12  kiyohara 
   3477   1.12  kiyohara void
   3478   1.12  kiyohara slhci_print_intr(void)
   3479   1.12  kiyohara {
   3480   1.12  kiyohara 	unsigned int ier, isr;
   3481   1.12  kiyohara 	ier = slhci_read(ssc, SL11_IER);
   3482   1.12  kiyohara 	isr = slhci_read(ssc, SL11_ISR);
   3483   1.12  kiyohara 	printf("IER: %#x ISR: %#x \n", ier, isr);
   3484   1.12  kiyohara }
   3485   1.12  kiyohara 
   3486   1.12  kiyohara #if 0
   3487   1.12  kiyohara void
   3488   1.22    cegger slhci_log_sc(void)
   3489   1.12  kiyohara {
   3490   1.84     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3491   1.84     skrll 
   3492   1.12  kiyohara 	struct slhci_transfers *t;
   3493   1.12  kiyohara 	int i;
   3494   1.12  kiyohara 
   3495   1.12  kiyohara 	t = &ssc->sc_transfers;
   3496   1.12  kiyohara 
   3497   1.12  kiyohara 	DDOLOG("Flags=%#x", t->flags, 0,0,0);
   3498   1.37     skrll 	DDOLOG("a = %p Alen=%d b = %p Blen=%d", t->spipe[0], t->len[0],
   3499   1.12  kiyohara 	    t->spipe[1], t->len[1]);
   3500   1.12  kiyohara 
   3501  1.104    simonb 	for (i = 0; i <= Q_MAX; i++)
   3502   1.84     skrll 		DDOLOG("Q %d: %p", i, gcq_hq(&t->q[i]), 0,0);
   3503   1.12  kiyohara 
   3504   1.84     skrll 	DDOLOG("TIMED: %p", GCQ_ITEM(gcq_hq(&t->to),
   3505   1.12  kiyohara 	    struct slhci_pipe, to), 0,0,0);
   3506   1.12  kiyohara 
   3507   1.12  kiyohara 	DDOLOG("frame=%d rootintr=%p", t->frame, t->rootintr, 0,0);
   3508   1.12  kiyohara 
   3509   1.48     skrll 	DDOLOG("ub_usepolling=%d", ssc->sc_bus.ub_usepolling, 0, 0, 0);
   3510   1.12  kiyohara }
   3511   1.12  kiyohara 
   3512   1.12  kiyohara void
   3513   1.12  kiyohara slhci_log_slreq(struct slhci_pipe *r)
   3514   1.12  kiyohara {
   3515   1.84     skrll 	SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
   3516   1.12  kiyohara 	DDOLOG("xfer: %p", r->xfer, 0,0,0);
   3517   1.12  kiyohara 	DDOLOG("buffer: %p", r->buffer, 0,0,0);
   3518   1.12  kiyohara 	DDOLOG("bustime: %u", r->bustime, 0,0,0);
   3519   1.12  kiyohara 	DDOLOG("control: %#x", r->control, 0,0,0);
   3520   1.84     skrll 	DDOLOGEPCTRL(r->control);
   3521   1.84     skrll 
   3522   1.12  kiyohara 	DDOLOG("pid: %#x", r->tregs[PID], 0,0,0);
   3523   1.12  kiyohara 	DDOLOG("dev: %u", r->tregs[DEV], 0,0,0);
   3524   1.12  kiyohara 	DDOLOG("len: %u", r->tregs[LEN], 0,0,0);
   3525   1.12  kiyohara 
   3526   1.12  kiyohara 	if (r->xfer)
   3527   1.12  kiyohara 		slhci_log_xfer(r->xfer);
   3528    1.1     isaki }
   3529   1.12  kiyohara #endif
   3530    1.1     isaki #endif /* SLHCI_DEBUG */
   3531   1.12  kiyohara /* End debug functions. */
   3532