summaryrefslogtreecommitdiff
path: root/drivers/usb/host/isp1763-hcd.h
blob: 2361952b0f5462e1f76459b1d6c0e32497dc99ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
/* 
* Copyright (C) ST-Ericsson AP Pte Ltd 2010 
*
* ISP1763 Linux OTG Controller driver : host
* 
* This program is free software; you can redistribute it and/or modify it under the terms of 
* the GNU General Public License as published by the Free Software Foundation; version 
* 2 of the License. 
* 
* This program is distributed in the hope that it will be useful, but WITHOUT ANY  
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  
* FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more  
* details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
* 
* Refer to file ~/drivers/usb/host/ehci-dbg.h for copyright owners (kernel version 2.6.9)
* Code is modified for ST-Ericsson product 
* 
* Author : wired support <wired.support@stericsson.com>
*
*/

#ifndef	__PEHCI_H__
#define	__PEHCI_H__


#define	DRIVER_AUTHOR	"ST-ERICSSON	  "
#define	DRIVER_DESC "ISP1763 'Enhanced'	Host Controller	(EHCI) Driver"

/*    bus related stuff	*/
#define	__ACTIVE		0x01
#define	__SLEEPY		0x02
#define	__SUSPEND		0x04
#define	__TRANSIENT		0x80

#define	USB_STATE_HALT		0
#define	USB_STATE_RUNNING	(__ACTIVE)
#define	USB_STATE_READY		(__ACTIVE|__SLEEPY)
#define	USB_STATE_QUIESCING	(__SUSPEND|__TRANSIENT|__ACTIVE)
#define	USB_STATE_RESUMING	(__SUSPEND|__TRANSIENT)
#define	USB_STATE_SUSPENDED	(__SUSPEND)

/* System flags	 */
#define	HCD_MEMORY		0x0001
#define	HCD_USB2		0x0020
#define	HCD_USB11		0x0010

#define	HCD_IS_RUNNING(state) ((state) & __ACTIVE)
#define	HCD_IS_SUSPENDED(state)	((state) & __SUSPEND)


/*---------------------------------------------------
 *    Host controller related
 -----------------------------------------------------*/
/* IRQ line for	the ISP1763 */
#define	HCD_IRQ			IRQ_GPIO(25)
#define	CMD_RESET		(1<<1)	/* reset HC not	bus */
#define	CMD_RUN			(1<<0)	/* start/stop HC */
#define	STS_PCD			(1<<2)	/* port	change detect */
/* NOTE:  urb->transfer_flags expected to not use this bit !!! */
#define	EHCI_STATE_UNLINK	0x8000	/* urb being unlinked */

/*  Bits definations for qha*/
/* Bits	PID*/
#define	SETUP_PID		(2)
#define	OUT_PID			(0)
#define	IN_PID			(1)

/* Bits	MULTI*/
#define	MULTI(x)		((x)<< 29)
#define	XFER_PER_UFRAME(x)	(((x) >> 29) & 0x3)

/*Active, EP type and speed bits */
#define	QHA_VALID		(1<<0)
#define	QHA_ACTIVE		(1<<31)

/*1763 error bit maps*/
#define	HC_MSOF_INT		(1<< 0)
#define	HC_MSEC_INT		(1 << 1)
#define	HC_EOT_INT		(1 << 3)
#define     HC_OPR_REG_INT	(1<<4)
#define     HC_CLK_RDY_INT	(1<<6)
#define	HC_INTL_INT		(1 << 7)
#define	HC_ATL_INT		(1 << 8)
#define	HC_ISO_INT		(1 << 9)
#define	HC_OTG_INT		(1 << 10)

/*PTD error codes*/
#define	PTD_STATUS_HALTED	(1 << 30)
#define	PTD_XACT_ERROR		(1 << 28)
#define	PTD_BABBLE		(1 << 29)
#define PTD_ERROR		(PTD_STATUS_HALTED | PTD_XACT_ERROR | PTD_BABBLE)
/*ep types*/
#define	EPTYPE_BULK		(2 << 12)
#define	EPTYPE_CONTROL		(0 << 12)
#define	EPTYPE_INT		(3 << 12)
#define	EPTYPE_ISO		(1 << 12)

#define	PHCI_QHA_LENGTH		32

#define usb_inc_dev_use		usb_get_dev
#define usb_dec_dev_use		usb_put_dev
#define usb_free_dev		usb_put_dev
/*1763 host controller periodic	size*/
#define PTD_PERIODIC_SIZE	16
#define MAX_PERIODIC_SIZE	16
#define PTD_FRAME_MASK		0x1f
/*periodic list*/
struct _periodic_list {
	int framenumber;
	struct list_head sitd_itd_head;
	char high_speed;	/*1 - HS ; 0 - FS*/
	u16 ptdlocation;
};
typedef	struct _periodic_list periodic_list;


/*iso ptd*/
struct _isp1763_isoptd {
	u32 td_info1;
	u32 td_info2;
	u32 td_info3;
	u32 td_info4;
	u32 td_info5;
	u32 td_info6;
	u32 td_info7;
	u32 td_info8;
} __attribute__	((aligned(32)));

typedef	struct _isp1763_isoptd isp1763_isoptd;

struct _isp1763_qhint {
	u32 td_info1;
	u32 td_info2;
	u32 td_info3;
	u32 td_info4;
	u32 td_info5;
#define	INT_UNDERRUN (1	<< 2)
#define	INT_BABBLE    (1 << 1)
#define	INT_EXACT     (1 << 0)
	u32 td_info6;
	u32 td_info7;
	u32 td_info8;
} __attribute__	((aligned(32)));

typedef	struct _isp1763_qhint isp1763_qhint;


struct _isp1763_qha {
	u32 td_info1;		/* First 32 bit	*/
	u32 td_info2;		/* Second 32 bit */
	u32 td_info3;		/* third 32 bit	*/
	u32 td_info4;		/* fourth 32 bit */
	u32 reserved[4];
};
typedef	struct _isp1763_qha isp1763_qha, *pisp1763_qha;




/*this does not	cover all interrupts in	1763 chip*/
typedef	struct _ehci_regs {

	/*standard ehci	registers */
	u32 command;
	u32 usbinterrupt;
	u32 usbstatus;
	u32 hcsparams;
	u32 frameindex;

	/*isp1763 interrupt specific registers */
	u16 hwmodecontrol;
	u16 interrupt;
	u16 interruptenable;
	u32 interruptthreshold;
	u16 iso_irq_mask_or;
	u16 int_irq_mask_or;
	u16 atl_irq_mask_or;
	u16 iso_irq_mask_and;
	u16 int_irq_mask_and;
	u16 atl_irq_mask_and;
	u16 buffer_status;

	/*isp1763 initialization registers */
	u32 reset;
	u32 configflag;
	u32 ports[4];
	u32 pwrdwn_ctrl;

	/*isp1763 transfer specific registers */
	u16 isotddonemap;
	u16 inttddonemap;
	u16 atltddonemap;
	u16 isotdskipmap;
	u16 inttdskipmap;
	u16 atltdskipmap;
	u16 isotdlastmap;
	u16 inttdlastmap;
	u16 atltdlastmap;
	u16 scratch;

} ehci_regs, *pehci_regs;

/*memory management structures*/
#define MEM_KV
#ifdef MEM_KV
typedef struct isp1763_mem_addr {
	u32 phy_addr;		/* Physical address of the memory */
	u32 virt_addr;		/* after ioremap() function call */
	u8 num_alloc;		/* In case n*smaller size is allocated then for clearing purpose */
	u32 blk_size;		/*block size */
	u8 blk_num;		/* number of the block */
	u8 used;		/*used/free */
} isp1763_mem_addr_t;
#else
typedef struct isp1763_mem_addr {
	void *phy_addr;		/* Physical address of the memory */
	void *virt_addr;	/* after ioremap() function call */
	u8 usage;
	u32 blk_size;		/*block size */
} isp1763_mem_addr_t;

#endif
/* type	tag from {qh,itd,sitd,fstn}->hw_next */
#define	Q_NEXT_TYPE(dma) ((dma)	& __constant_cpu_to_le32 (3 << 1))

/* values for that type	tag */
#define	Q_TYPE_ITD	__constant_cpu_to_le32 (0 << 1)
#define	Q_TYPE_QH	__constant_cpu_to_le32 (1 << 1)
#define	Q_TYPE_SITD	__constant_cpu_to_le32 (2 << 1)
#define	Q_TYPE_FSTN	__constant_cpu_to_le32 (3 << 1)

/*next queuehead in execution*/
#define	QH_NEXT(dma)	cpu_to_le32((u32)dma)

struct ehci_qh {
	/* first part defined by EHCI spec */
	u32 hw_next;		/* see EHCI 3.6.1 */
	u32 hw_info1;		/* see EHCI 3.6.2 */

	u32 hw_info2;		/* see EHCI 3.6.2 */
	u32 hw_current;		/* qtd list - see EHCI 3.6.4 */

	/* qtd overlay (hardware parts of a struct ehci_qtd) */
	u32 hw_qtd_next;
	u32 hw_alt_next;
	u32 hw_token;
	u32 hw_buf[5];
	u32 hw_buf_hi[5];
	
	/* the rest is HCD-private */
	dma_addr_t qh_dma;	/* address of qh */
	struct list_head qtd_list;	/* sw qtd list */
	struct ehci_qtd	*dummy;
	struct ehci_qh *reclaim;	/* next	to reclaim */

	atomic_t refcount;
	wait_queue_head_t waitforcomplete;
	unsigned stamp;

	u8 qh_state;

	/* periodic schedule info */
	u8 usecs;		/* intr	bandwidth */
	u8 gap_uf;		/* uframes split/csplit	gap */
	u8 c_usecs;		/* ... split completion	bw */
	unsigned short period;	/* polling interval */
	unsigned short start;	/* where polling starts	*/
	u8 datatoggle;		/*data toggle */

	/*handling the ping stuffs */
	u8 ping;		/*ping bit */

	/*qtd <-> ptd management */

	u32 qtd_ptd_index;	/* Td-PTD map index for	this ptd */
	u32 type;		/* endpoint type */

	/*iso stuffs */
	struct usb_host_endpoint *ep;
	int next_uframe;	/*next uframe for this endpoint	*/
	struct list_head itd_list;	/*list of tds to this endpoint */
	isp1763_mem_addr_t memory_addr;
	struct _periodic_list periodic_list;
	/*scheduling requirements for this endpoint */
	u32 ssplit;
	u32 csplit;
	u8 totalptds;   // total number of PTDs needed for current URB
	u8 actualptds;	// scheduled PTDs until now for current URB
};

/* urb private part for	the driver. */
typedef	struct {
	struct ehci_qh *qh;
	u16 length;		/* number of tds associated with this request */
	u16 td_cnt;		/* number of tds already serviced */
	int state;		/* State machine state when URB	is deleted  */
	int timeout;		/* timeout for bulk transfers */
	wait_queue_head_t wait;	/* wait	State machine state when URB is	deleted	*/
	/*FIX solve the	full speed dying */
	struct timer_list urb_timer;
	struct list_head qtd_list;
	struct ehci_qtd	*qtd[0];	/* list	pointer	to all corresponding TDs associated with this request */

} urb_priv_t;

/*
 * EHCI	Specification 0.95 Section 3.6
 * QH: describes control/bulk/interrupt	endpoints
 * See Fig 3-7 "Queue Head Structure Layout".
 *
 * These appear	in both	the async and (for interrupt) periodic schedules.
 */


/*Defination required for the ehci Queuehead */
#define	QH_HEAD			0x00008000
#define	QH_STATE_LINKED		1	/* HC sees this	*/
#define	QH_STATE_UNLINK		2	/* HC may still	see this */
#define	QH_STATE_IDLE		3	/* HC doesn't see this */
#define	QH_STATE_UNLINK_WAIT	4	/* LINKED and on reclaim q */
#define	QH_STATE_COMPLETING	5	/* don't touch token.HALT */
#define	QH_STATE_TAKE_NEXT	8	/*take the new transfer	from */
#define	NO_FRAME ((unsigned short)~0)	/* pick	new start */


#define EHCI_ITD_TRANLENGTH	0x0fff0000	/*transaction length */
#define EHCI_ITD_PG		0x00007000	/*page select */
#define EHCI_ITD_TRANOFFSET	0x00000fff	/*transaction offset */
#define EHCI_ITD_BUFFPTR	0xfffff000	/*buffer pointer */

struct ehci_sitd {
	/* first part defined by EHCI spec */
	u32 hw_next;		/* see EHCI 3.3.1 */
	u32 hw_transaction[8];	/* see EHCI 3.3.2 */
#define EHCI_ISOC_ACTIVE	(1<<31)	/* activate transfer this slot */
#define EHCI_ISOC_BUF_ERR	(1<<30)	/* Data buffer error */
#define EHCI_ISOC_BABBLE	(1<<29)	/* babble detected */
#define EHCI_ISOC_XACTERR	(1<<28)	/* XactErr - transaction error */

#define EHCI_ITD_LENGTH(tok)	(((tok)>>16) & 0x7fff)
#define EHCI_ITD_IOC		(1 << 15)	/* interrupt on complete */

	u32 hw_bufp[7];		/* see EHCI 3.3.3 */
	u32 hw_bufp_hi[7];	/* Appendix B */

	/* the rest is HCD-private */
	dma_addr_t sitd_dma;	/* for this itd */
	struct urb *urb;
	struct list_head sitd_list;	/* list of urb frames' itds */
	dma_addr_t buf_dma;	/* frame's buffer address */

	/* for now, only one hw_transaction per itd */
	u32 transaction;
	u16 index;		/* in urb->iso_frame_desc */
	u16 uframe;		/* in periodic schedule */
	u16 usecs;
	/*memory address */
	struct isp1763_mem_addr mem_addr;
	int length;
	u32 framenumber;
	u32 ptdframe;
	int sitd_index;
	/*scheduling fields */
	u32 ssplit;
	u32 csplit;
	u32 start_frame;
};

struct ehci_itd	{
	/* first part defined by EHCI spec */
	u32 hw_next;		/* see EHCI 3.3.1 */
	u32 hw_transaction[8];	/* see EHCI 3.3.2 */
#define	EHCI_ISOC_ACTIVE	(1<<31)	/* activate transfer this slot */
#define	EHCI_ISOC_BUF_ERR	(1<<30)	/* Data	buffer error */
#define	EHCI_ISOC_BABBLE	(1<<29)	/* babble detected */
#define	EHCI_ISOC_XACTERR	(1<<28)	/* XactErr - transaction error */

#define	EHCI_ITD_LENGTH(tok)	(((tok)>>16) & 0x7fff)
#define	EHCI_ITD_IOC		(1 << 15)	/* interrupt on	complete */

	u32 hw_bufp[7];		/* see EHCI 3.3.3 */
	u32 hw_bufp_hi[7];	/* Appendix B */

	/* the rest is HCD-private */
	dma_addr_t itd_dma;	/* for this itd	*/
	struct urb *urb;
	struct list_head itd_list;	/* list	of urb frames' itds */
	dma_addr_t buf_dma;	/* frame's buffer address */
	u8 num_of_pkts;		/*number of packets for this ITD */
	/* for now, only one hw_transaction per	itd */
	u32 transaction;
	u16 index;		/* in urb->iso_frame_desc */
	u16 uframe;		/* in periodic schedule	*/
	u16 usecs;
	/*memory address */
	struct isp1763_mem_addr	mem_addr;
	int length;
	u32 multi;
	u32 framenumber;
	u32 ptdframe;
	int itd_index;
	/*scheduling fields */
	u32 ssplit;
	u32 csplit;
};

/*
 * EHCI	Specification 0.95 Section 3.5
 * QTD:	describe data transfer components (buffer, direction, ...)
 * See Fig 3-6 "Queue Element Transfer Descriptor Block	Diagram".
 *
 * These are associated	only with "QH" (Queue Head) structures,
 * used	with control, bulk, and	interrupt transfers.
 */
struct ehci_qtd	{
	/* first part defined by EHCI spec */
	u32 hw_next;		/* see EHCI 3.5.1 */
	u32 hw_alt_next;	/* see EHCI 3.5.2 */
	u32 hw_token;		/* see EHCI 3.5.3 */

	u32 hw_buf[5];		/* see EHCI 3.5.4 */
	u32 hw_buf_hi[5];	/* Appendix B */

	/* the rest is HCD-private */
	dma_addr_t qtd_dma;	/* qtd address */
	struct list_head qtd_list;	/* sw qtd list */
	struct urb *urb;	/* qtd's urb */
	size_t length;		/* length of buffer */
	u32 state;		/*state	of the qtd */
#define	QTD_STATE_NEW			0x100
#define	QTD_STATE_DONE			0x200
#define	QTD_STATE_SCHEDULED		0x400
#define	QTD_STATE_LAST			0x800
	struct isp1763_mem_addr	mem_addr;
};

#define	QTD_TOGGLE			(1 << 31)	/* data	toggle */
#define	QTD_LENGTH(tok)			(((tok)>>16) & 0x7fff)
#define	QTD_IOC				(1 << 15)	/* interrupt on	complete */
#define	QTD_CERR(tok)			(((tok)>>10) & 0x3)
#define	QTD_PID(tok)			(((tok)>>8) & 0x3)
#define	QTD_STS_ACTIVE			(1 << 7)	/* HC may execute this */
#define	QTD_STS_HALT			(1 << 6)	/* halted on error */
#define	QTD_STS_DBE			(1 << 5)	/* data	buffer error (in HC) */
#define	QTD_STS_BABBLE			(1 << 4)	/* device was babbling (qtd halted) */
#define	QTD_STS_XACT			(1 << 3)	/* device gave illegal response	*/
#define	QTD_STS_MMF			(1 << 2)	/* incomplete split transaction	*/
#define	QTD_STS_STS			(1 << 1)	/* split transaction state */
#define	QTD_STS_PING			(1 << 0)	/* issue PING? */

/* for periodic/async schedules	and qtd	lists, mark end	of list	*/
#define	EHCI_LIST_END	__constant_cpu_to_le32(1)	/* "null pointer" to hw	*/
#define	QTD_NEXT(dma)	cpu_to_le32((u32)dma)

struct _phci_driver;
struct _isp1763_hcd;
#define	EHCI_MAX_ROOT_PORTS 1

#include <linux/usb/hcd.h>

#define USBNET
#ifdef USBNET 
struct isp1763_async_cleanup_urb {
        struct list_head urb_list;
        struct urb *urb;
};
#endif


/*host controller*/
typedef	struct _phci_hcd {

	struct usb_hcd usb_hcd;
	spinlock_t lock;

	/* async schedule support */
	struct ehci_qh *async;
	struct ehci_qh *reclaim;
	/* periodic schedule support */
	unsigned periodic_size;
	int next_uframe;	/* scan	periodic, start	here */
	int periodic_sched;	/* periodic activity count */
	int periodic_more_urb;
	struct usb_device *otgdev;	/*otg deice, with address 2 */
	struct timer_list rh_timer;	/* drives root hub */
	struct list_head dev_list;	/* devices on this bus */
	struct list_head urb_list;	/*iso testing */

	/*msec break in	interrupts */
	atomic_t nuofsofs;
	atomic_t missedsofs;

	struct isp1763_dev *dev;
	/*hw info */
	u8 *iobase;
	u32 iolength;
	u8 *plxiobase;
	u32 plxiolength;

	int irq;		/* irq allocated */
	int state;		/*state	of the host controller */
	unsigned long reset_done[EHCI_MAX_ROOT_PORTS];
	ehci_regs regs;

	struct _isp1763_qha qha;
	struct _isp1763_qhint qhint;
	struct _isp1763_isoptd isotd;

	struct tasklet_struct tasklet;
	/*this timer is	going to run every 20 msec */
	struct timer_list watchdog;
	void (*worker_function)	(struct	_phci_hcd * hcd);
	struct _periodic_list periodic_list[PTD_PERIODIC_SIZE];
#ifdef USBNET 
	struct isp1763_async_cleanup_urb cleanup_urb;
#endif
} phci_hcd, *pphci_hcd;

/*usb_device->hcpriv, points to	this structure*/
typedef	struct hcd_dev {
	struct list_head dev_list;
	struct list_head urb_list;
} hcd_dev;

#define	usb_hcd_to_pehci_hcd(hcd)   container_of(hcd, struct _phci_hcd,	usb_hcd)

/*td allocation*/
#ifdef CONFIG_PHCI_MEM_SLAB

#define	qha_alloc(t,c) kmem_cache_alloc(c,ALLOC_FLAGS)
#define	qha_free(c,x) kmem_cache_free(c,x)
static kmem_cache_t *qha_cache,	*qh_cache, *qtd_cache;
static int
phci_hcd_mem_init(void)
{
	/* qha TDs accessed by controllers and host */
	qha_cache = kmem_cache_create("phci_ptd", sizeof(isp1763_qha), 0,
				      SLAB_HWCACHE_ALIGN, NULL,	NULL);
	if (!qha_cache)	{
		printk("no TD cache?");
		return -ENOMEM;
	}

	/* qh TDs accessed by controllers and host */
	qh_cache = kmem_cache_create("phci_ptd", sizeof(isp1763_qha), 0,
				     SLAB_HWCACHE_ALIGN, NULL, NULL);
	if (!qh_cache) {
		printk("no TD cache?");
		return -ENOMEM;
	}

	/* qtd	accessed by controllers	and host */
	qtd_cache = kmem_cache_create("phci_ptd", sizeof(isp1763_qha), 0,
				      SLAB_HWCACHE_ALIGN, NULL,	NULL);
	if (!qtd_cache)	{
		printk("no TD cache?");
		return -ENOMEM;
	}
	return 0;
}
static void
phci_mem_cleanup(void)
{
	if (qha_cache && kmem_cache_destroy(qha_cache))
		err("td_cache remained");
	qha_cache = 0;
}
#else

#define	qha_alloc(t,c)			kmalloc(t,ALLOC_FLAGS)
#define	qha_free(c,x)			kfree(x)
#define	qha_cache			0


#ifdef CONFIG_ISO_SUPPORT
/*memory constants*/
#define BLK_128_	2
#define BLK_256_	3
#define BLK_1024_	1
#define BLK_2048_	3
#define BLK_4096_	3 //1
#define BLK_8196_	0 //1
#define BLK_TOTAL	(BLK_128_+BLK_256_ + BLK_1024_ +BLK_2048_+ BLK_4096_+BLK_8196_)

#define BLK_SIZE_128	128
#define BLK_SIZE_256	256
#define BLK_SIZE_1024	1024
#define BLK_SIZE_2048	2048
#define BLK_SIZE_4096	4096
#define BLK_SIZE_8192	8192

#define  COMMON_MEMORY	1

#else
#define BLK_256_	8
#define BLK_1024_	6
#define BLK_4096_	3
#define BLK_TOTAL	(BLK_256_ + BLK_1024_ + BLK_4096_)
#define BLK_SIZE_256	256
#define BLK_SIZE_1024	1024
#define BLK_SIZE_4096	4096
#endif
static void phci_hcd_mem_init(void);
static inline void
phci_mem_cleanup(void)
{
	return;
}

#endif

#define	PORT_WKOC_E			(1<<22)	/* wake	on overcurrent (enable)	*/
#define	PORT_WKDISC_E			(1<<21)	/* wake	on disconnect (enable) */
#define	PORT_WKCONN_E			(1<<20)	/* wake	on connect (enable) */
/* 19:16 for port testing */
/* 15:14 for using port	indicator leds (if HCS_INDICATOR allows) */
#define	PORT_OWNER			(1<<13)	/* true: companion hc owns this	port */
#define	PORT_POWER			(1<<12)	/* true: has power (see	PPC) */
#define	PORT_USB11(x)			(((x)&(3<<10))==(1<<10))	/* USB 1.1 device */
/* 11:10 for detecting lowspeed	devices	(reset vs release ownership) */
/* 9 reserved */
#define	PORT_RESET			(1<<8)	/* reset port */
#define	PORT_SUSPEND			(1<<7)	/* suspend port	*/
#define	PORT_RESUME			(1<<6)	/* resume it */
#define	PORT_OCC			(1<<5)	/* over	current	change */

#define	PORT_OC				(1<<4)	/* over	current	active */
#define	PORT_PEC			(1<<3)	/* port	enable change */
#define	PORT_PE				(1<<2)	/* port	enable */
#define	PORT_CSC			(1<<1)	/* connect status change */
#define	PORT_CONNECT			(1<<0)	/* device connected */
#define PORT_RWC_BITS	(PORT_CSC | PORT_PEC | PORT_OCC)	
/*Legends,
 * ATL	  control, bulk	transfer
 * INTL	  interrupt transfer
 * ISTL	  iso transfer
 * */

/*buffer(transfer) bitmaps*/
#define	ATL_BUFFER			0x1
#define	INT_BUFFER			0x2
#define	ISO_BUFFER			0x4
#define	BUFFER_MAP			0x7

/* buffer type for ST-ERICSSON HC */
#define	TD_PTD_BUFF_TYPE_ATL		0	/* ATL buffer */
#define	TD_PTD_BUFF_TYPE_INTL		1	/* INTL	buffer */
#define	TD_PTD_BUFF_TYPE_ISTL		2	/* ISO buffer */
#define	TD_PTD_TOTAL_BUFF_TYPES		(TD_PTD_BUFF_TYPE_ISTL +1)
/*maximum number of tds	per transfer type*/
#define	TD_PTD_MAX_BUFF_TDS		16

/*invalid td index in the headers*/
#define	TD_PTD_INV_PTD_INDEX		0xFFFF
/*Host controller buffer defination*/
#define	INVALID_FRAME_NUMBER		0xFFFFFFFF
/*per td transfer size*/
#define	HC_ATL_PL_SIZE			4096
#define	HC_ISTL_PL_SIZE			1024
#define	HC_INTL_PL_SIZE			1024

/*TD_PTD_MAP states*/
#define	TD_PTD_NEW			0x0000
#define	TD_PTD_ACTIVE			0x0001
#define	TD_PTD_IDLE			0x0002
#define	TD_PTD_REMOVE			0x0004
#define	TD_PTD_RELOAD			0x0008
#define	TD_PTD_IN_SCHEDULE		0x0010
#define	TD_PTD_DONE			0x0020

#define	PTD_RETRY(x)			(((x) >> 23) & 0x3)
#define	PTD_PID(x)			(((x) >> 10) & (0x3))
#define	PTD_NEXTTOGGLE(x)		(((x) >> 25) & (0x1))
#define	PTD_XFERRED_LENGTH(x)		((x) & 0x7fff)
#define	PTD_XFERRED_NONHSLENGTH(x)	((x) & 0x7ff)
#define	PTD_PING_STATE(x)		(((x) >> 26) & (0x1))

/* urb state*/
#define	DELETE_URB			0x0008
#define	NO_TRANSFER_ACTIVE		0xFFFF
#define	NO_TRANSFER_DONE		0x0000
#define	MAX_PTD_BUFFER_SIZE		4096	/*max ptd size */

/*information of the td	in headers of host memory*/
typedef	struct td_ptd_map {
	u32 state;		/* ACTIVE, NEW,	TO_BE_REMOVED */
	u8 datatoggle;		/*to preserve the data toggle for ATL/ISTL transfers */
	u32 ptd_bitmap;		/* Bitmap of this ptd in HC headers */
	u32 ptd_header_addr;	/* headers address of  this td */
	u32 ptd_data_addr;	/*data address of this td to write in and read from */
	/*this is address is actual RAM	address	not the	CPU address
	 * RAM address = (CPU ADDRESS-0x400) >>	3
	 * */
	u32 ptd_ram_data_addr;
	u8 lasttd;		/*last td , complete the transfer */
	struct ehci_qh *qh;	/* endpoint */
	struct ehci_qtd	*qtd;	/* qtds	for this endpoint */
	struct ehci_itd	*itd;	/*itd pointer */
	struct ehci_sitd *sitd;	/*itd pointer */
	/*iso specific only */
	u32 grouptdmap;		/*if td	need to	complete with error, then process all the tds
				   in the groupmap    */
} td_ptd_map_t;

/*buffer(ATL/ISTL/INTL)	managemnet*/
typedef	struct td_ptd_map_buff {
	u8 buffer_type;		/* Buffer type:	BUFF_TYPE_ATL/INTL/ISTL0/ISTL1 */
	u8 active_ptds;		/* number of active td's in the	buffer */
	u8 total_ptds;		/* Total number	of td's	present	in the buffer (active +	tobe removed + skip) */
	u8 max_ptds;		/* Maximum number of ptd's(32) this buffer can withstand */
	u16 active_ptd_bitmap;	/* Active PTD's	bitmap */
	u16 pending_ptd_bitmap;	/* skip	PTD's bitmap */
	td_ptd_map_t map_list[TD_PTD_MAX_BUFF_TDS];	/* td_ptd_map list */
} td_ptd_map_buff_t;


#define     USB_HCD_MAJOR           245
#define     USB_HCD_MODULE_NAME     "isp1763hcd"

#if 1 
static char devpath[] = "/dev/isp1763hcd";
#endif

#define HCD_IOC_MAGIC	'h'

#define     HCD_IOC_POWERDOWN							_IO(HCD_IOC_MAGIC, 1)
#define     HCD_IOC_POWERUP								_IO(HCD_IOC_MAGIC, 2)
#define     HCD_IOC_TESTSE0_NACK						_IO(HCD_IOC_MAGIC, 3)
#define     HCD_IOC_TEST_J								_IO(HCD_IOC_MAGIC,4)
#define     HCD_IOC_TEST_K								_IO(HCD_IOC_MAGIC,5)
#define     HCD_IOC_TEST_TESTPACKET						_IO(HCD_IOC_MAGIC,6)
#define     HCD_IOC_TEST_FORCE_ENABLE					_IO(HCD_IOC_MAGIC,7)
#define	  HCD_IOC_TEST_SUSPEND_RESUME				_IO(HCD_IOC_MAGIC,8)
#define     HCD_IOC_TEST_SINGLE_STEP_GET_DEV_DESC		_IO(HCD_IOC_MAGIC,9)
#define     HCD_IOC_TEST_SINGLE_STEP_SET_FEATURE		_IO(HCD_IOC_MAGIC,10)
#define     HCD_IOC_TEST_STOP							_IO(HCD_IOC_MAGIC,11)
#define     HCD_IOC_SUSPEND_BUS							_IO(HCD_IOC_MAGIC,12)
#define     HCD_IOC_RESUME_BUS							_IO(HCD_IOC_MAGIC,13)
#define     HCD_IOC_REMOTEWAKEUP_BUS					_IO(HCD_IOC_MAGIC,14)

#define HOST_COMPILANCE_TEST_ENABLE	1
#define HOST_COMP_TEST_SE0_NAK	1
#define HOST_COMP_TEST_J	2
#define HOST_COMP_TEST_K	3
#define HOST_COMP_TEST_PACKET		4
#define HOST_COMP_TEST_FORCE_ENABLE	5
#define HOST_COMP_HS_HOST_PORT_SUSPEND_RESUME	6
#define HOST_COMP_SINGLE_STEP_GET_DEV_DESC	7
#define HOST_COMP_SINGLE_STEP_SET_FEATURE	8

#endif