|  | @@ -173,6 +173,61 @@ static int ehci_ctrl_reachable ( struct ehci_device *ehci, void *ptr ) {
 | 
		
	
		
			
			| 173 | 173 |  	return -ENOTSUP;
 | 
		
	
		
			
			| 174 | 174 |  }
 | 
		
	
		
			
			| 175 | 175 |  
 | 
		
	
		
			
			|  | 176 | +/******************************************************************************
 | 
		
	
		
			
			|  | 177 | + *
 | 
		
	
		
			
			|  | 178 | + * Diagnostics
 | 
		
	
		
			
			|  | 179 | + *
 | 
		
	
		
			
			|  | 180 | + ******************************************************************************
 | 
		
	
		
			
			|  | 181 | + */
 | 
		
	
		
			
			|  | 182 | +
 | 
		
	
		
			
			|  | 183 | +/**
 | 
		
	
		
			
			|  | 184 | + * Dump host controller registers
 | 
		
	
		
			
			|  | 185 | + *
 | 
		
	
		
			
			|  | 186 | + * @v ehci		EHCI device
 | 
		
	
		
			
			|  | 187 | + */
 | 
		
	
		
			
			|  | 188 | +static __unused void ehci_dump ( struct ehci_device *ehci ) {
 | 
		
	
		
			
			|  | 189 | +	uint8_t caplength;
 | 
		
	
		
			
			|  | 190 | +	uint16_t hciversion;
 | 
		
	
		
			
			|  | 191 | +	uint32_t hcsparams;
 | 
		
	
		
			
			|  | 192 | +	uint32_t hccparams;
 | 
		
	
		
			
			|  | 193 | +	uint32_t usbcmd;
 | 
		
	
		
			
			|  | 194 | +	uint32_t usbsts;
 | 
		
	
		
			
			|  | 195 | +	uint32_t usbintr;
 | 
		
	
		
			
			|  | 196 | +	uint32_t frindex;
 | 
		
	
		
			
			|  | 197 | +	uint32_t ctrldssegment;
 | 
		
	
		
			
			|  | 198 | +	uint32_t periodiclistbase;
 | 
		
	
		
			
			|  | 199 | +	uint32_t asynclistaddr;
 | 
		
	
		
			
			|  | 200 | +	uint32_t configflag;
 | 
		
	
		
			
			|  | 201 | +
 | 
		
	
		
			
			|  | 202 | +	/* Do nothing unless debugging is enabled */
 | 
		
	
		
			
			|  | 203 | +	if ( ! DBG_LOG )
 | 
		
	
		
			
			|  | 204 | +		return;
 | 
		
	
		
			
			|  | 205 | +
 | 
		
	
		
			
			|  | 206 | +	/* Dump capability registers */
 | 
		
	
		
			
			|  | 207 | +	caplength = readb ( ehci->cap + EHCI_CAP_CAPLENGTH );
 | 
		
	
		
			
			|  | 208 | +	hciversion = readw ( ehci->cap + EHCI_CAP_HCIVERSION );
 | 
		
	
		
			
			|  | 209 | +	hcsparams = readl ( ehci->cap + EHCI_CAP_HCSPARAMS );
 | 
		
	
		
			
			|  | 210 | +	hccparams = readl ( ehci->cap + EHCI_CAP_HCCPARAMS );
 | 
		
	
		
			
			|  | 211 | +	DBGC ( ehci, "EHCI %s caplen %02x hciversion %04x hcsparams %08x "
 | 
		
	
		
			
			|  | 212 | +	       "hccparams %08x\n", ehci->name, caplength, hciversion,
 | 
		
	
		
			
			|  | 213 | +	       hcsparams,  hccparams );
 | 
		
	
		
			
			|  | 214 | +
 | 
		
	
		
			
			|  | 215 | +	/* Dump operational registers */
 | 
		
	
		
			
			|  | 216 | +	usbcmd = readl ( ehci->op + EHCI_OP_USBCMD );
 | 
		
	
		
			
			|  | 217 | +	usbsts = readl ( ehci->op + EHCI_OP_USBSTS );
 | 
		
	
		
			
			|  | 218 | +	usbintr = readl ( ehci->op + EHCI_OP_USBINTR );
 | 
		
	
		
			
			|  | 219 | +	frindex = readl ( ehci->op + EHCI_OP_FRINDEX );
 | 
		
	
		
			
			|  | 220 | +	ctrldssegment = readl ( ehci->op + EHCI_OP_CTRLDSSEGMENT );
 | 
		
	
		
			
			|  | 221 | +	periodiclistbase = readl ( ehci->op + EHCI_OP_PERIODICLISTBASE );
 | 
		
	
		
			
			|  | 222 | +	asynclistaddr = readl ( ehci->op + EHCI_OP_ASYNCLISTADDR );
 | 
		
	
		
			
			|  | 223 | +	configflag = readl ( ehci->op + EHCI_OP_CONFIGFLAG );
 | 
		
	
		
			
			|  | 224 | +	DBGC ( ehci, "EHCI %s usbcmd %08x usbsts %08x usbint %08x frindx "
 | 
		
	
		
			
			|  | 225 | +	       "%08x\n", ehci->name, usbcmd, usbsts, usbintr, frindex );
 | 
		
	
		
			
			|  | 226 | +	DBGC ( ehci, "EHCI %s ctrlds %08x period %08x asyncl %08x cfgflg "
 | 
		
	
		
			
			|  | 227 | +	       "%08x\n", ehci->name, ctrldssegment, periodiclistbase,
 | 
		
	
		
			
			|  | 228 | +	       asynclistaddr, configflag );
 | 
		
	
		
			
			|  | 229 | +}
 | 
		
	
		
			
			|  | 230 | +
 | 
		
	
		
			
			| 176 | 231 |  /******************************************************************************
 | 
		
	
		
			
			| 177 | 232 |   *
 | 
		
	
		
			
			| 178 | 233 |   * USB legacy support
 | 
		
	
	
		
			
			|  | @@ -233,6 +288,14 @@ static void ehci_legacy_claim ( struct ehci_device *ehci,
 | 
		
	
		
			
			| 233 | 288 |  	if ( ! legacy )
 | 
		
	
		
			
			| 234 | 289 |  		return;
 | 
		
	
		
			
			| 235 | 290 |  
 | 
		
	
		
			
			|  | 291 | +	/* Dump original SMI usage */
 | 
		
	
		
			
			|  | 292 | +	pci_read_config_dword ( pci, ( legacy + EHCI_USBLEGSUP_CTLSTS ),
 | 
		
	
		
			
			|  | 293 | +				&ctlsts );
 | 
		
	
		
			
			|  | 294 | +	if ( ctlsts ) {
 | 
		
	
		
			
			|  | 295 | +		DBGC ( ehci, "EHCI %s BIOS using SMIs: %08x\n",
 | 
		
	
		
			
			|  | 296 | +		       ehci->name, ctlsts );
 | 
		
	
		
			
			|  | 297 | +	}
 | 
		
	
		
			
			|  | 298 | +
 | 
		
	
		
			
			| 236 | 299 |  	/* Claim ownership */
 | 
		
	
		
			
			| 237 | 300 |  	pci_write_config_byte ( pci, ( legacy + EHCI_USBLEGSUP_OS ),
 | 
		
	
		
			
			| 238 | 301 |  				EHCI_USBLEGSUP_OS_OWNED );
 | 
		
	
	
		
			
			|  | @@ -276,9 +339,11 @@ static void ehci_legacy_claim ( struct ehci_device *ehci,
 | 
		
	
		
			
			| 276 | 339 |   */
 | 
		
	
		
			
			| 277 | 340 |  static void ehci_legacy_release ( struct ehci_device *ehci,
 | 
		
	
		
			
			| 278 | 341 |  				  struct pci_device *pci ) {
 | 
		
	
		
			
			|  | 342 | +	unsigned int legacy = ehci->legacy;
 | 
		
	
		
			
			|  | 343 | +	uint32_t ctlsts;
 | 
		
	
		
			
			| 279 | 344 |  
 | 
		
	
		
			
			| 280 | 345 |  	/* Do nothing unless legacy support capability is present */
 | 
		
	
		
			
			| 281 |  | -	if ( ! ehci->legacy )
 | 
		
	
		
			
			|  | 346 | +	if ( ! legacy )
 | 
		
	
		
			
			| 282 | 347 |  		return;
 | 
		
	
		
			
			| 283 | 348 |  
 | 
		
	
		
			
			| 284 | 349 |  	/* Do nothing if releasing ownership is prevented */
 | 
		
	
	
		
			
			|  | @@ -289,8 +354,14 @@ static void ehci_legacy_release ( struct ehci_device *ehci,
 | 
		
	
		
			
			| 289 | 354 |  	}
 | 
		
	
		
			
			| 290 | 355 |  
 | 
		
	
		
			
			| 291 | 356 |  	/* Release ownership */
 | 
		
	
		
			
			| 292 |  | -	pci_write_config_byte ( pci, ( ehci->legacy + EHCI_USBLEGSUP_OS ), 0 );
 | 
		
	
		
			
			|  | 357 | +	pci_write_config_byte ( pci, ( legacy + EHCI_USBLEGSUP_OS ), 0 );
 | 
		
	
		
			
			| 293 | 358 |  	DBGC ( ehci, "EHCI %s released ownership to BIOS\n", ehci->name );
 | 
		
	
		
			
			|  | 359 | +
 | 
		
	
		
			
			|  | 360 | +	/* Dump restored SMI usage */
 | 
		
	
		
			
			|  | 361 | +	pci_read_config_dword ( pci, ( legacy + EHCI_USBLEGSUP_CTLSTS ),
 | 
		
	
		
			
			|  | 362 | +				&ctlsts );
 | 
		
	
		
			
			|  | 363 | +	DBGC ( ehci, "EHCI %s BIOS reclaimed SMIs: %08x\n",
 | 
		
	
		
			
			|  | 364 | +	       ehci->name, ctlsts );
 | 
		
	
		
			
			| 294 | 365 |  }
 | 
		
	
		
			
			| 295 | 366 |  
 | 
		
	
		
			
			| 296 | 367 |  /******************************************************************************
 |