Mon Feb 5 23:07:42 2024 UTC (116d)
Ensure proper alignment/padding of EHCI hardware descriptors.

These descriptor structs are embedded in structs that contain additional
context for software. With a non cache coherent device and non-padded
descriptors, the device may issue a read/modify/write past the end of
the descriptor, clobbering software state in the process. This was the
root cause of multiple crashes on evbppc with a non cache coherent EHCI.


(jmcneill)
diff -r1.37 -r1.38 src/sys/dev/usb/ehcireg.h

cvs diff -r1.37 -r1.38 src/sys/dev/usb/ehcireg.h (expand / switch to unified diff)

--- src/sys/dev/usb/ehcireg.h 2016/04/23 10:15:31 1.37
+++ src/sys/dev/usb/ehcireg.h 2024/02/05 23:07:42 1.38
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: ehcireg.h,v 1.37 2016/04/23 10:15:31 skrll Exp $ */ 1/* $NetBSD: ehcireg.h,v 1.38 2024/02/05 23:07:42 jmcneill Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc. 4 * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Lennart Augustsson (lennart@augustsson.net). 8 * by Lennart Augustsson (lennart@augustsson.net).
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -193,26 +193,27 @@ typedef uint32_t ehci_link_t; @@ -193,26 +193,27 @@ typedef uint32_t ehci_link_t;
193#define EHCI_LINK_TYPE(x) ((x) & 0x00000006) 193#define EHCI_LINK_TYPE(x) ((x) & 0x00000006)
194#define EHCI_LINK_ITD 0x0 194#define EHCI_LINK_ITD 0x0
195#define EHCI_LINK_QH 0x2 195#define EHCI_LINK_QH 0x2
196#define EHCI_LINK_SITD 0x4 196#define EHCI_LINK_SITD 0x4
197#define EHCI_LINK_FSTN 0x6 197#define EHCI_LINK_FSTN 0x6
198#define EHCI_LINK_ADDR(x) ((x) &~ 0x1f) 198#define EHCI_LINK_ADDR(x) ((x) &~ 0x1f)
199 199
200typedef uint32_t ehci_physaddr_t; 200typedef uint32_t ehci_physaddr_t;
201 201
202typedef uint32_t ehci_isoc_trans_t; 202typedef uint32_t ehci_isoc_trans_t;
203typedef uint32_t ehci_isoc_bufr_ptr_t; 203typedef uint32_t ehci_isoc_bufr_ptr_t;
204 204
205/* Isochronous Transfer Descriptor */ 205/* Isochronous Transfer Descriptor */
 206#define EHCI_ITD_ALIGN 32
206#define EHCI_ITD_NUFRAMES USB_UFRAMES_PER_FRAME 207#define EHCI_ITD_NUFRAMES USB_UFRAMES_PER_FRAME
207#define EHCI_ITD_NBUFFERS 7 208#define EHCI_ITD_NBUFFERS 7
208typedef struct { 209typedef struct {
209 volatile ehci_link_t itd_next; 210 volatile ehci_link_t itd_next;
210 volatile ehci_isoc_trans_t itd_ctl[EHCI_ITD_NUFRAMES]; 211 volatile ehci_isoc_trans_t itd_ctl[EHCI_ITD_NUFRAMES];
211#define EHCI_ITD_STATUS_MASK __BITS(31,28) 212#define EHCI_ITD_STATUS_MASK __BITS(31,28)
212#define EHCI_ITD_GET_STATUS(x) __SHIFTOUT((x), EHCI_ITD_STATUS_MASK) 213#define EHCI_ITD_GET_STATUS(x) __SHIFTOUT((x), EHCI_ITD_STATUS_MASK)
213#define EHCI_ITD_SET_STATUS(x) __SHIFTIN((x), EHCI_ITD_STATUS_MASK) 214#define EHCI_ITD_SET_STATUS(x) __SHIFTIN((x), EHCI_ITD_STATUS_MASK)
214#define EHCI_ITD_ACTIVE __BIT(31) 215#define EHCI_ITD_ACTIVE __BIT(31)
215#define EHCI_ITD_BUF_ERR __BIT(30) 216#define EHCI_ITD_BUF_ERR __BIT(30)
216#define EHCI_ITD_BABBLE __BIT(29) 217#define EHCI_ITD_BABBLE __BIT(29)
217#define EHCI_ITD_ERROR __BIT(28) 218#define EHCI_ITD_ERROR __BIT(28)
218#define EHCI_ITD_LEN_MASK __BITS(27,16) 219#define EHCI_ITD_LEN_MASK __BITS(27,16)
@@ -237,30 +238,30 @@ typedef struct { @@ -237,30 +238,30 @@ typedef struct {
237#define EHCI_ITD_DADDR_MASK __BITS(6,0) 238#define EHCI_ITD_DADDR_MASK __BITS(6,0)
238#define EHCI_ITD_GET_DADDR(x) __SHIFTOUT((x), EHCI_ITD_DADDR_MASK) 239#define EHCI_ITD_GET_DADDR(x) __SHIFTOUT((x), EHCI_ITD_DADDR_MASK)
239#define EHCI_ITD_SET_DADDR(x) __SHIFTIN((x), EHCI_ITD_DADDR_MASK) 240#define EHCI_ITD_SET_DADDR(x) __SHIFTIN((x), EHCI_ITD_DADDR_MASK)
240#define EHCI_ITD_DIR_MASK __BIT(11) 241#define EHCI_ITD_DIR_MASK __BIT(11)
241#define EHCI_ITD_GET_DIR(x) __SHIFTOUT((x), EHCI_ITD_DIR_MASK) 242#define EHCI_ITD_GET_DIR(x) __SHIFTOUT((x), EHCI_ITD_DIR_MASK)
242#define EHCI_ITD_SET_DIR(x) __SHIFTIN((x), EHCI_ITD_DIR_MASK) 243#define EHCI_ITD_SET_DIR(x) __SHIFTIN((x), EHCI_ITD_DIR_MASK)
243#define EHCI_ITD_MAXPKT_MASK __BITS(10,0) 244#define EHCI_ITD_MAXPKT_MASK __BITS(10,0)
244#define EHCI_ITD_GET_MAXPKT(x) __SHIFTOUT((x), EHCI_ITD_MAXPKT_MASK) 245#define EHCI_ITD_GET_MAXPKT(x) __SHIFTOUT((x), EHCI_ITD_MAXPKT_MASK)
245#define EHCI_ITD_SET_MAXPKT(x) __SHIFTIN((x), EHCI_ITD_MAXPKT_MASK) 246#define EHCI_ITD_SET_MAXPKT(x) __SHIFTIN((x), EHCI_ITD_MAXPKT_MASK)
246#define EHCI_ITD_MULTI_MASK __BITS(1,0) 247#define EHCI_ITD_MULTI_MASK __BITS(1,0)
247#define EHCI_ITD_GET_MULTI(x) __SHIFTOUT((x), EHCI_ITD_MULTI_MASK) 248#define EHCI_ITD_GET_MULTI(x) __SHIFTOUT((x), EHCI_ITD_MULTI_MASK)
248#define EHCI_ITD_SET_MULTI(x) __SHIFTIN((x), EHCI_ITD_MULTI_MASK) 249#define EHCI_ITD_SET_MULTI(x) __SHIFTIN((x), EHCI_ITD_MULTI_MASK)
249 volatile ehci_isoc_bufr_ptr_t itd_bufr_hi[EHCI_ITD_NBUFFERS]; 250 volatile ehci_isoc_bufr_ptr_t itd_bufr_hi[EHCI_ITD_NBUFFERS];
250} ehci_itd_t; 251} __aligned(EHCI_ITD_ALIGN) ehci_itd_t;
251#define EHCI_ITD_ALIGN 32 
252 252
253/* Split Transaction Isochronous Transfer Descriptor */ 253/* Split Transaction Isochronous Transfer Descriptor */
 254#define EHCI_SITD_ALIGN 32
254typedef struct { 255typedef struct {
255 volatile ehci_link_t sitd_next; 256 volatile ehci_link_t sitd_next;
256 volatile uint32_t sitd_endp; 257 volatile uint32_t sitd_endp;
257#define EHCI_SITD_DIR_MASK __BIT(31) 258#define EHCI_SITD_DIR_MASK __BIT(31)
258#define EHCI_SITD_PORT_MASK __BITS(30,24) 259#define EHCI_SITD_PORT_MASK __BITS(30,24)
259#define EHCI_SITD_HUBA_MASK __BITS(22,16) 260#define EHCI_SITD_HUBA_MASK __BITS(22,16)
260#define EHCI_SITD_ENDPT_MASK __BITS(11,8) 261#define EHCI_SITD_ENDPT_MASK __BITS(11,8)
261#define EHCI_SITD_DADDR_MASK __BITS(6,0) 262#define EHCI_SITD_DADDR_MASK __BITS(6,0)
262#define EHCI_SITD_SET_DIR(x) __SHIFTIN((x), EHCI_SITD_DIR_MASK) 263#define EHCI_SITD_SET_DIR(x) __SHIFTIN((x), EHCI_SITD_DIR_MASK)
263#define EHCI_SITD_SET_PORT(x) __SHIFTIN((x), EHCI_SITD_PORT_MASK) 264#define EHCI_SITD_SET_PORT(x) __SHIFTIN((x), EHCI_SITD_PORT_MASK)
264#define EHCI_SITD_SET_HUBA(x) __SHIFTIN((x), EHCI_SITD_HUBA_MASK) 265#define EHCI_SITD_SET_HUBA(x) __SHIFTIN((x), EHCI_SITD_HUBA_MASK)
265#define EHCI_SITD_SET_ENDPT(x) __SHIFTIN((x), EHCI_SITD_ENDPT_MASK) 266#define EHCI_SITD_SET_ENDPT(x) __SHIFTIN((x), EHCI_SITD_ENDPT_MASK)
266#define EHCI_SITD_SET_DADDR(x) __SHIFTIN((x), EHCI_SITD_DADDR_MASK) 267#define EHCI_SITD_SET_DADDR(x) __SHIFTIN((x), EHCI_SITD_DADDR_MASK)
@@ -284,32 +285,32 @@ typedef struct { @@ -284,32 +285,32 @@ typedef struct {
284#define EHCI_SITD_MISS 0x00000004 285#define EHCI_SITD_MISS 0x00000004
285#define EHCI_SITD_SPLITXSTATE 0x00000002 286#define EHCI_SITD_SPLITXSTATE 0x00000002
286 287
287#define EHCI_SITD_BUFFERS 2 288#define EHCI_SITD_BUFFERS 2
288 289
289 volatile uint32_t sitd_buffer[EHCI_SITD_BUFFERS]; 290 volatile uint32_t sitd_buffer[EHCI_SITD_BUFFERS];
290#define EHCI_SITD_SET_BPTR(x) ((x) & 0xfffff000) 291#define EHCI_SITD_SET_BPTR(x) ((x) & 0xfffff000)
291#define EHCI_SITD_SET_OFFS(x) ((x) & 0xfff) 292#define EHCI_SITD_SET_OFFS(x) ((x) & 0xfff)
292#define EHCI_SITD_TP_MASK __BITS(4,3) 293#define EHCI_SITD_TP_MASK __BITS(4,3)
293#define EHCI_SITD_TCOUNT_MASK __BITS(2,0) 294#define EHCI_SITD_TCOUNT_MASK __BITS(2,0)
294 295
295 volatile ehci_link_t sitd_back; 296 volatile ehci_link_t sitd_back;
296 volatile uint32_t sitd_buffer_hi[EHCI_SITD_BUFFERS]; 297 volatile uint32_t sitd_buffer_hi[EHCI_SITD_BUFFERS];
297} ehci_sitd_t; 298} __aligned(EHCI_SITD_ALIGN) ehci_sitd_t;
298#define EHCI_SITD_ALIGN 32 
299 299
300/* Queue Element Transfer Descriptor */ 300/* Queue Element Transfer Descriptor */
301#define EHCI_QTD_NBUFFERS 5 301#define EHCI_QTD_NBUFFERS 5
302#define EHCI_QTD_MAXTRANSFER (EHCI_QTD_NBUFFERS * EHCI_PAGE_SIZE) 302#define EHCI_QTD_MAXTRANSFER (EHCI_QTD_NBUFFERS * EHCI_PAGE_SIZE)
 303#define EHCI_QTD_ALIGN 32
303typedef struct { 304typedef struct {
304 volatile ehci_link_t qtd_next; 305 volatile ehci_link_t qtd_next;
305 volatile ehci_link_t qtd_altnext; 306 volatile ehci_link_t qtd_altnext;
306 volatile uint32_t qtd_status; 307 volatile uint32_t qtd_status;
307#define EHCI_QTD_STATUS_MASK __BITS(7,0) 308#define EHCI_QTD_STATUS_MASK __BITS(7,0)
308#define EHCI_QTD_GET_STATUS(x) __SHIFTOUT((x), EHCI_QTD_STATUS_MASK) 309#define EHCI_QTD_GET_STATUS(x) __SHIFTOUT((x), EHCI_QTD_STATUS_MASK)
309#define EHCI_QTD_SET_STATUS(x) __SHIFTIN((x), EHCI_QTD_STATUS_MASK) 310#define EHCI_QTD_SET_STATUS(x) __SHIFTIN((x), EHCI_QTD_STATUS_MASK)
310#define EHCI_QTD_ACTIVE 0x80 311#define EHCI_QTD_ACTIVE 0x80
311#define EHCI_QTD_HALTED 0x40 312#define EHCI_QTD_HALTED 0x40
312#define EHCI_QTD_BUFERR 0x20 313#define EHCI_QTD_BUFERR 0x20
313#define EHCI_QTD_BABBLE 0x10 314#define EHCI_QTD_BABBLE 0x10
314#define EHCI_QTD_XACTERR 0x08 315#define EHCI_QTD_XACTERR 0x08
315#define EHCI_QTD_MISSEDMICRO 0x04 316#define EHCI_QTD_MISSEDMICRO 0x04
@@ -328,30 +329,30 @@ typedef struct { @@ -328,30 +329,30 @@ typedef struct {
328#define EHCI_QTD_C_PAGE_MASK __BITS(14,12) 329#define EHCI_QTD_C_PAGE_MASK __BITS(14,12)
329#define EHCI_QTD_GET_C_PAGE(x) __SHIFTOUT((x), EHCI_QTD_C_PAGE_MASK) 330#define EHCI_QTD_GET_C_PAGE(x) __SHIFTOUT((x), EHCI_QTD_C_PAGE_MASK)
330#define EHCI_QTD_SET_C_PAGE(x) __SHIFTIN((x), EHCI_QTD_C_PAGE_MASK) 331#define EHCI_QTD_SET_C_PAGE(x) __SHIFTIN((x), EHCI_QTD_C_PAGE_MASK)
331#define EHCI_QTD_IOC __BIT(15) 332#define EHCI_QTD_IOC __BIT(15)
332#define EHCI_QTD_GET_IOC(x) __SHIFTOUT((x), EHCI_QTD_IOC) 333#define EHCI_QTD_GET_IOC(x) __SHIFTOUT((x), EHCI_QTD_IOC)
333#define EHCI_QTD_BYTES_MASK __BITS(30,16) 334#define EHCI_QTD_BYTES_MASK __BITS(30,16)
334#define EHCI_QTD_GET_BYTES(x) __SHIFTOUT((x), EHCI_QTD_BYTES_MASK) 335#define EHCI_QTD_GET_BYTES(x) __SHIFTOUT((x), EHCI_QTD_BYTES_MASK)
335#define EHCI_QTD_SET_BYTES(x) __SHIFTIN((x), EHCI_QTD_BYTES_MASK) 336#define EHCI_QTD_SET_BYTES(x) __SHIFTIN((x), EHCI_QTD_BYTES_MASK)
336#define EHCI_QTD_TOGGLE_MASK __BIT(31) 337#define EHCI_QTD_TOGGLE_MASK __BIT(31)
337#define EHCI_QTD_GET_TOGGLE(x) __SHIFTOUT((x), EHCI_QTD_TOGGLE_MASK) 338#define EHCI_QTD_GET_TOGGLE(x) __SHIFTOUT((x), EHCI_QTD_TOGGLE_MASK)
338#define EHCI_QTD_SET_TOGGLE(x) __SHIFTIN((x), EHCI_QTD_TOGGLE_MASK) 339#define EHCI_QTD_SET_TOGGLE(x) __SHIFTIN((x), EHCI_QTD_TOGGLE_MASK)
339 volatile ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS]; 340 volatile ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS];
340 volatile ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]; 341 volatile ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS];
341} ehci_qtd_t; 342} __aligned(EHCI_QTD_ALIGN) ehci_qtd_t;
342#define EHCI_QTD_ALIGN 32 
343 343
344/* Queue Head */ 344/* Queue Head */
 345#define EHCI_QH_ALIGN 32
345typedef struct { 346typedef struct {
346 volatile ehci_link_t qh_link; 347 volatile ehci_link_t qh_link;
347 volatile uint32_t qh_endp; 348 volatile uint32_t qh_endp;
348#define EHCI_QH_ADDR_MASK __BITS(6,0) /* endpoint addr */ 349#define EHCI_QH_ADDR_MASK __BITS(6,0) /* endpoint addr */
349#define EHCI_QH_GET_ADDR(x) __SHIFTOUT((x), EHCI_QH_ADDR_MASK) 350#define EHCI_QH_GET_ADDR(x) __SHIFTOUT((x), EHCI_QH_ADDR_MASK)
350#define EHCI_QH_SET_ADDR(x) __SHIFTIN((x), EHCI_QH_ADDR_MASK) 351#define EHCI_QH_SET_ADDR(x) __SHIFTIN((x), EHCI_QH_ADDR_MASK)
351#define EHCI_QH_INACT __BIT(7) /* inactivate on next */ 352#define EHCI_QH_INACT __BIT(7) /* inactivate on next */
352#define EHCI_QH_GET_INACT(x) __SHIFTOUT((x), EHCI_QH_INACT) 353#define EHCI_QH_GET_INACT(x) __SHIFTOUT((x), EHCI_QH_INACT)
353#define EHCI_QH_ENDPT_MASK __BITS(11,8) /* endpoint no */ 354#define EHCI_QH_ENDPT_MASK __BITS(11,8) /* endpoint no */
354#define EHCI_QH_GET_ENDPT(x) __SHIFTOUT((x), EHCI_QH_ENDPT_MASK) 355#define EHCI_QH_GET_ENDPT(x) __SHIFTOUT((x), EHCI_QH_ENDPT_MASK)
355#define EHCI_QH_SET_ENDPT(x) __SHIFTIN((x), EHCI_QH_ENDPT_MASK) 356#define EHCI_QH_SET_ENDPT(x) __SHIFTIN((x), EHCI_QH_ENDPT_MASK)
356#define EHCI_QH_EPS_MASK __BITS(13,12) /* endpoint speed */ 357#define EHCI_QH_EPS_MASK __BITS(13,12) /* endpoint speed */
357#define EHCI_QH_GET_EPS(x) __SHIFTOUT((x), EHCI_QH_EPS_MASK) 358#define EHCI_QH_GET_EPS(x) __SHIFTOUT((x), EHCI_QH_EPS_MASK)
@@ -378,36 +379,46 @@ typedef struct { @@ -378,36 +379,46 @@ typedef struct {
378#define EHCI_QH_CMASK_MASK __BITS(15,8) /* split completion mask */ 379#define EHCI_QH_CMASK_MASK __BITS(15,8) /* split completion mask */
379#define EHCI_QH_GET_CMASK(x) __SHIFTOUT((x), EHCI_QH_CMASK_MASK) 380#define EHCI_QH_GET_CMASK(x) __SHIFTOUT((x), EHCI_QH_CMASK_MASK)
380#define EHCI_QH_SET_CMASK(x) __SHIFTIN((x), EHCI_QH_CMASK_MASK) 381#define EHCI_QH_SET_CMASK(x) __SHIFTIN((x), EHCI_QH_CMASK_MASK)
381#define EHCI_QH_HUBA_MASK __BITS(22,16) /* hub address */ 382#define EHCI_QH_HUBA_MASK __BITS(22,16) /* hub address */
382#define EHCI_QH_GET_HUBA(x) __SHIFTOUT((x), EHCI_QH_HUBA_MASK) 383#define EHCI_QH_GET_HUBA(x) __SHIFTOUT((x), EHCI_QH_HUBA_MASK)
383#define EHCI_QH_SET_HUBA(x) __SHIFTIN((x), EHCI_QH_HUBA_MASK) 384#define EHCI_QH_SET_HUBA(x) __SHIFTIN((x), EHCI_QH_HUBA_MASK)
384#define EHCI_QH_PORT_MASK __BITS(29,23) /* hub port */ 385#define EHCI_QH_PORT_MASK __BITS(29,23) /* hub port */
385#define EHCI_QH_GET_PORT(x) __SHIFTOUT((x), EHCI_QH_PORT_MASK) 386#define EHCI_QH_GET_PORT(x) __SHIFTOUT((x), EHCI_QH_PORT_MASK)
386#define EHCI_QH_SET_PORT(x) __SHIFTIN((x), EHCI_QH_PORT_MASK) 387#define EHCI_QH_SET_PORT(x) __SHIFTIN((x), EHCI_QH_PORT_MASK)
387#define EHCI_QH_MULTI_MASK __BITS(31,30) /* pipe multiplier */ 388#define EHCI_QH_MULTI_MASK __BITS(31,30) /* pipe multiplier */
388#define EHCI_QH_GET_MULT(x) __SHIFTOUT((x), EHCI_QH_MULTI_MASK) 389#define EHCI_QH_GET_MULT(x) __SHIFTOUT((x), EHCI_QH_MULTI_MASK)
389#define EHCI_QH_SET_MULT(x) __SHIFTIN((x), EHCI_QH_MULTI_MASK) 390#define EHCI_QH_SET_MULT(x) __SHIFTIN((x), EHCI_QH_MULTI_MASK)
390 volatile ehci_link_t qh_curqtd; 391 volatile ehci_link_t qh_curqtd;
391 ehci_qtd_t qh_qtd; 392 /*
392} ehci_qh_t; 393 * The QH descriptor contains a TD overlay, but it is not
393#define EHCI_QH_ALIGN 32 394 * 32-byte aligned, so declare the fields instead of embedding
 395 * a ehci_qtd_t directly.
 396 */
 397 struct {
 398 volatile ehci_link_t qtd_next;
 399 volatile ehci_link_t qtd_altnext;
 400 volatile uint32_t qtd_status;
 401 volatile ehci_physaddr_t qtd_buffer[EHCI_QTD_NBUFFERS];
 402 volatile ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS];
 403 } qh_qtd;
 404} __aligned(EHCI_QH_ALIGN) ehci_qh_t;
394 405
395/* Periodic Frame Span Traversal Node */ 406/* Periodic Frame Span Traversal Node */
 407#define EHCI_FSTN_ALIGN 32
396typedef struct { 408typedef struct {
397 volatile ehci_link_t fstn_link; 409 volatile ehci_link_t fstn_link;
398 volatile ehci_link_t fstn_back; 410 volatile ehci_link_t fstn_back;
399} ehci_fstn_t; 411} __aligned(EHCI_FSTN_ALIGN) ehci_fstn_t;
400#define EHCI_FSTN_ALIGN 32 
401 412
402/* Debug Port */ 413/* Debug Port */
403#define PCI_CAP_DEBUGPORT_OFFSET __BITS(28,16) 414#define PCI_CAP_DEBUGPORT_OFFSET __BITS(28,16)
404#define PCI_CAP_DEBUGPORT_BAR __BITS(31,29) 415#define PCI_CAP_DEBUGPORT_BAR __BITS(31,29)
405/* Debug Port Registers, offset into DEBUGPORT_BAR at DEBUGPORT_OFFSET */ 416/* Debug Port Registers, offset into DEBUGPORT_BAR at DEBUGPORT_OFFSET */
406#define EHCI_DEBUG_SC 0x00 417#define EHCI_DEBUG_SC 0x00
407/* Status/Control Register */ 418/* Status/Control Register */
408#define EHCI_DSC_DATA_LENGTH __BITS(3,0) 419#define EHCI_DSC_DATA_LENGTH __BITS(3,0)
409#define EHCI_DSC_WRITE __BIT(4) 420#define EHCI_DSC_WRITE __BIT(4)
410#define EHCI_DSC_GO __BIT(5) 421#define EHCI_DSC_GO __BIT(5)
411#define EHCI_DSC_ERROR __BIT(6) 422#define EHCI_DSC_ERROR __BIT(6)
412#define EHCI_DSC_EXCEPTION __BITS(9,7) 423#define EHCI_DSC_EXCEPTION __BITS(9,7)
413#define EHCI_DSC_EXCEPTION_NONE 0 424#define EHCI_DSC_EXCEPTION_NONE 0