Changes in uspace/drv/bus/usb/ehci/res.c [5b7ba8d:d930980] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/ehci/res.c
r5b7ba8d rd930980 76 76 * @return Error code. 77 77 */ 78 int get_my_registers( constddf_dev_t *dev,78 int get_my_registers(ddf_dev_t *dev, 79 79 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 80 80 { … … 82 82 83 83 async_sess_t *parent_sess = devman_parent_device_connect( 84 EXCHANGE_SERIALIZE, d ev->handle, IPC_FLAG_BLOCKING);84 EXCHANGE_SERIALIZE, ddf_dev_get_handle(dev), IPC_FLAG_BLOCKING); 85 85 if (!parent_sess) 86 86 return ENOMEM; … … 109 109 return EOK; 110 110 } 111 /*----------------------------------------------------------------------------*/ 111 112 112 /** Calls the PCI driver with a request to enable interrupts 113 113 * … … 115 115 * @return Error code. 116 116 */ 117 int enable_interrupts( constddf_dev_t *device)117 int enable_interrupts(ddf_dev_t *device) 118 118 { 119 119 async_sess_t *parent_sess = devman_parent_device_connect( 120 EXCHANGE_SERIALIZE, d evice->handle, IPC_FLAG_BLOCKING);120 EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING); 121 121 if (!parent_sess) 122 122 return ENOMEM; … … 127 127 return enabled ? EOK : EIO; 128 128 } 129 /*----------------------------------------------------------------------------*/ 129 130 130 /** Implements BIOS hands-off routine as described in EHCI spec 131 131 * … … 134 134 * @return Error code. 135 135 */ 136 static int disable_extended_caps( constddf_dev_t *device, unsigned eecp)136 static int disable_extended_caps(ddf_dev_t *device, unsigned eecp) 137 137 { 138 138 /* nothing to do */ … … 141 141 142 142 async_sess_t *parent_sess = devman_parent_device_connect( 143 EXCHANGE_SERIALIZE, d evice->handle, IPC_FLAG_BLOCKING);143 EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING); 144 144 if (!parent_sess) 145 145 return ENOMEM; 146 146 147 #define CHECK_RET_HANGUP_RETURN(ret, message...) \148 if (ret != EOK) { \149 usb_log_error(message); \150 async_hangup(parent_sess); \151 return ret; \152 } else (void)0153 154 147 /* Read the first EEC. i.e. Legacy Support register */ 155 148 uint32_t usblegsup; 156 int r et= pci_config_space_read_32(parent_sess,149 int rc = pci_config_space_read_32(parent_sess, 157 150 eecp + USBLEGSUP_OFFSET, &usblegsup); 158 CHECK_RET_HANGUP_RETURN(ret, 159 "Failed to read USBLEGSUP: %s.\n", str_error(ret)); 151 if (rc != EOK) { 152 usb_log_error("Failed to read USBLEGSUP: %s.\n", 153 str_error(rc)); 154 goto error; 155 } 156 160 157 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 161 158 … … 163 160 * byte. (OS Control semaphore)*/ 164 161 usb_log_debug("Requesting OS control.\n"); 165 r et= pci_config_space_write_8(parent_sess,162 rc = pci_config_space_write_8(parent_sess, 166 163 eecp + USBLEGSUP_OFFSET + 3, 1); 167 CHECK_RET_HANGUP_RETURN(ret, "Failed to request OS EHCI control: %s.\n", 168 str_error(ret)); 164 if (rc != EOK) { 165 usb_log_error("Failed to request OS EHCI control: %s.\n", 166 str_error(rc)); 167 goto error; 168 } 169 169 170 170 size_t wait = 0; 171 171 /* Wait for BIOS to release control. */ 172 r et= pci_config_space_read_32(172 rc = pci_config_space_read_32( 173 173 parent_sess, eecp + USBLEGSUP_OFFSET, &usblegsup); 174 if (rc != EOK) { 175 usb_log_error("Failed reading PCI config space: %s.\n", 176 str_error(rc)); 177 goto error; 178 } 179 174 180 while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) { 175 181 async_usleep(WAIT_STEP); 176 r et= pci_config_space_read_32(parent_sess,182 rc = pci_config_space_read_32(parent_sess, 177 183 eecp + USBLEGSUP_OFFSET, &usblegsup); 184 if (rc != EOK) { 185 usb_log_error("Failed reading PCI config space: %s.\n", 186 str_error(rc)); 187 goto error; 188 } 178 189 wait += WAIT_STEP; 179 190 } … … 188 199 usb_log_warning( "BIOS failed to release control after " 189 200 "%zu usecs, force it.\n", wait); 190 r et= pci_config_space_write_32(parent_sess,201 rc = pci_config_space_write_32(parent_sess, 191 202 eecp + USBLEGSUP_OFFSET, USBLEGSUP_OS_CONTROL); 192 CHECK_RET_HANGUP_RETURN(ret, "Failed to force OS control: " 193 "%s.\n", str_error(ret)); 203 if (rc != EOK) { 204 usb_log_error("Failed to force OS control: " 205 "%s.\n", str_error(rc)); 206 goto error; 207 } 208 194 209 /* 195 210 * Check capability type here, value of 01h identifies the capability … … 201 216 /* Read the second EEC Legacy Support and Control register */ 202 217 uint32_t usblegctlsts; 203 r et= pci_config_space_read_32(parent_sess,218 rc = pci_config_space_read_32(parent_sess, 204 219 eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 205 CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS: %s.\n", 206 str_error(ret)); 220 if (rc != EOK) { 221 usb_log_error("Failed to get USBLEGCTLSTS: %s.\n", 222 str_error(rc)); 223 goto error; 224 } 225 207 226 usb_log_debug("USBLEGCTLSTS: %" PRIx32 ".\n", usblegctlsts); 208 227 /* … … 211 230 * interfering. NOTE: Three upper bits are WC 212 231 */ 213 r et= pci_config_space_write_32(parent_sess,232 rc = pci_config_space_write_32(parent_sess, 214 233 eecp + USBLEGCTLSTS_OFFSET, 0xe0000000); 215 CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret); 234 if (rc != EOK) { 235 usb_log_error("Failed(%d) zero USBLEGCTLSTS.\n", rc); 236 goto error; 237 } 238 216 239 udelay(10); 217 r et= pci_config_space_read_32(parent_sess,240 rc = pci_config_space_read_32(parent_sess, 218 241 eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 219 CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS 2: %s.\n", 220 str_error(ret)); 242 if (rc != EOK) { 243 usb_log_error("Failed to get USBLEGCTLSTS 2: %s.\n", 244 str_error(rc)); 245 goto error; 246 } 247 221 248 usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n", 222 249 usblegctlsts); … … 224 251 225 252 /* Read again Legacy Support register */ 226 r et= pci_config_space_read_32(parent_sess,253 rc = pci_config_space_read_32(parent_sess, 227 254 eecp + USBLEGSUP_OFFSET, &usblegsup); 228 CHECK_RET_HANGUP_RETURN(ret, "Failed to read USBLEGSUP: %s.\n", 229 str_error(ret)); 255 if (rc != EOK) { 256 usb_log_error("Failed to read USBLEGSUP: %s.\n", 257 str_error(rc)); 258 goto error; 259 } 260 230 261 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 231 262 async_hangup(parent_sess); 232 263 return EOK; 233 #undef CHECK_RET_HANGUP_RETURN 264 error: 265 async_hangup(parent_sess); 266 return rc; 234 267 } 235 268 236 int disable_legacy( constddf_dev_t *device, uintptr_t reg_base, size_t reg_size)269 int disable_legacy(ddf_dev_t *device, uintptr_t reg_base, size_t reg_size) 237 270 { 238 271 assert(device); 239 272 usb_log_debug("Disabling EHCI legacy support.\n"); 240 273 241 #define CHECK_RET_RETURN(ret, message...) \242 if (ret != EOK) { \243 usb_log_error(message); \244 return ret; \245 } else (void)0246 247 274 /* Map EHCI registers */ 248 275 void *regs = NULL; 249 int ret = pio_enable((void*)reg_base, reg_size, ®s); 250 CHECK_RET_RETURN(ret, "Failed to map registers %p: %s.\n", 251 (void *) reg_base, str_error(ret)); 276 int rc = pio_enable((void*)reg_base, reg_size, ®s); 277 if (rc != EOK) { 278 usb_log_error("Failed to map registers %p: %s.\n", 279 (void *) reg_base, str_error(rc)); 280 return rc; 281 } 252 282 253 283 usb_log_debug2("Registers mapped at: %p.\n", regs); … … 263 293 usb_log_debug("Value of EECP: %x.\n", eecp); 264 294 265 ret = disable_extended_caps(device, eecp); 266 CHECK_RET_RETURN(ret, "Failed to disable extended capabilities: %s.\n", 267 str_error(ret)); 268 269 #undef CHECK_RET_RETURN 295 rc = disable_extended_caps(device, eecp); 296 if (rc != EOK) { 297 usb_log_error("Failed to disable extended capabilities: %s.\n", 298 str_error(rc)); 299 return rc; 300 } 270 301 271 302 /* … … 306 337 usbcmd, *usbcmd, usbsts, *usbsts, usbint, *usbint, usbconf,*usbconf); 307 338 308 return r et;339 return rc; 309 340 } 310 341
Note:
See TracChangeset
for help on using the changeset viewer.