diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/isci/host.c | 1000 | ||||
-rw-r--r-- | drivers/scsi/isci/host.h | 210 | ||||
-rw-r--r-- | drivers/scsi/isci/init.c | 10 | ||||
-rw-r--r-- | drivers/scsi/isci/phy.c | 40 | ||||
-rw-r--r-- | drivers/scsi/isci/port.c | 89 | ||||
-rw-r--r-- | drivers/scsi/isci/port.h | 4 | ||||
-rw-r--r-- | drivers/scsi/isci/port_config.c | 82 | ||||
-rw-r--r-- | drivers/scsi/isci/probe_roms.h | 2 | ||||
-rw-r--r-- | drivers/scsi/isci/remote_device.c | 76 | ||||
-rw-r--r-- | drivers/scsi/isci/remote_device.h | 6 | ||||
-rw-r--r-- | drivers/scsi/isci/remote_node_context.c | 14 | ||||
-rw-r--r-- | drivers/scsi/isci/request.c | 200 | ||||
-rw-r--r-- | drivers/scsi/isci/request.h | 4 | ||||
-rw-r--r-- | drivers/scsi/isci/task.c | 44 | ||||
-rw-r--r-- | drivers/scsi/isci/unsolicited_frame_control.c | 6 | ||||
-rw-r--r-- | drivers/scsi/isci/unsolicited_frame_control.h | 4 |
16 files changed, 806 insertions, 985 deletions
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c index 45d7f71c609a..bb298f8f609a 100644 --- a/drivers/scsi/isci/host.c +++ b/drivers/scsi/isci/host.c | |||
@@ -181,35 +181,35 @@ void sci_change_state(struct sci_base_state_machine *sm, u32 next_state) | |||
181 | } | 181 | } |
182 | 182 | ||
183 | static bool scic_sds_controller_completion_queue_has_entries( | 183 | static bool scic_sds_controller_completion_queue_has_entries( |
184 | struct scic_sds_controller *scic) | 184 | struct isci_host *ihost) |
185 | { | 185 | { |
186 | u32 get_value = scic->completion_queue_get; | 186 | u32 get_value = ihost->completion_queue_get; |
187 | u32 get_index = get_value & SMU_COMPLETION_QUEUE_GET_POINTER_MASK; | 187 | u32 get_index = get_value & SMU_COMPLETION_QUEUE_GET_POINTER_MASK; |
188 | 188 | ||
189 | if (NORMALIZE_GET_POINTER_CYCLE_BIT(get_value) == | 189 | if (NORMALIZE_GET_POINTER_CYCLE_BIT(get_value) == |
190 | COMPLETION_QUEUE_CYCLE_BIT(scic->completion_queue[get_index])) | 190 | COMPLETION_QUEUE_CYCLE_BIT(ihost->completion_queue[get_index])) |
191 | return true; | 191 | return true; |
192 | 192 | ||
193 | return false; | 193 | return false; |
194 | } | 194 | } |
195 | 195 | ||
196 | static bool scic_sds_controller_isr(struct scic_sds_controller *scic) | 196 | static bool scic_sds_controller_isr(struct isci_host *ihost) |
197 | { | 197 | { |
198 | if (scic_sds_controller_completion_queue_has_entries(scic)) { | 198 | if (scic_sds_controller_completion_queue_has_entries(ihost)) { |
199 | return true; | 199 | return true; |
200 | } else { | 200 | } else { |
201 | /* | 201 | /* |
202 | * we have a spurious interrupt it could be that we have already | 202 | * we have a spurious interrupt it could be that we have already |
203 | * emptied the completion queue from a previous interrupt */ | 203 | * emptied the completion queue from a previous interrupt */ |
204 | writel(SMU_ISR_COMPLETION, &scic->smu_registers->interrupt_status); | 204 | writel(SMU_ISR_COMPLETION, &ihost->smu_registers->interrupt_status); |
205 | 205 | ||
206 | /* | 206 | /* |
207 | * There is a race in the hardware that could cause us not to be notified | 207 | * There is a race in the hardware that could cause us not to be notified |
208 | * of an interrupt completion if we do not take this step. We will mask | 208 | * of an interrupt completion if we do not take this step. We will mask |
209 | * then unmask the interrupts so if there is another interrupt pending | 209 | * then unmask the interrupts so if there is another interrupt pending |
210 | * the clearing of the interrupt source we get the next interrupt message. */ | 210 | * the clearing of the interrupt source we get the next interrupt message. */ |
211 | writel(0xFF000000, &scic->smu_registers->interrupt_mask); | 211 | writel(0xFF000000, &ihost->smu_registers->interrupt_mask); |
212 | writel(0, &scic->smu_registers->interrupt_mask); | 212 | writel(0, &ihost->smu_registers->interrupt_mask); |
213 | } | 213 | } |
214 | 214 | ||
215 | return false; | 215 | return false; |
@@ -219,18 +219,18 @@ irqreturn_t isci_msix_isr(int vec, void *data) | |||
219 | { | 219 | { |
220 | struct isci_host *ihost = data; | 220 | struct isci_host *ihost = data; |
221 | 221 | ||
222 | if (scic_sds_controller_isr(&ihost->sci)) | 222 | if (scic_sds_controller_isr(ihost)) |
223 | tasklet_schedule(&ihost->completion_tasklet); | 223 | tasklet_schedule(&ihost->completion_tasklet); |
224 | 224 | ||
225 | return IRQ_HANDLED; | 225 | return IRQ_HANDLED; |
226 | } | 226 | } |
227 | 227 | ||
228 | static bool scic_sds_controller_error_isr(struct scic_sds_controller *scic) | 228 | static bool scic_sds_controller_error_isr(struct isci_host *ihost) |
229 | { | 229 | { |
230 | u32 interrupt_status; | 230 | u32 interrupt_status; |
231 | 231 | ||
232 | interrupt_status = | 232 | interrupt_status = |
233 | readl(&scic->smu_registers->interrupt_status); | 233 | readl(&ihost->smu_registers->interrupt_status); |
234 | interrupt_status &= (SMU_ISR_QUEUE_ERROR | SMU_ISR_QUEUE_SUSPEND); | 234 | interrupt_status &= (SMU_ISR_QUEUE_ERROR | SMU_ISR_QUEUE_SUSPEND); |
235 | 235 | ||
236 | if (interrupt_status != 0) { | 236 | if (interrupt_status != 0) { |
@@ -246,28 +246,27 @@ static bool scic_sds_controller_error_isr(struct scic_sds_controller *scic) | |||
246 | * then unmask the error interrupts so if there was another interrupt | 246 | * then unmask the error interrupts so if there was another interrupt |
247 | * pending we will be notified. | 247 | * pending we will be notified. |
248 | * Could we write the value of (SMU_ISR_QUEUE_ERROR | SMU_ISR_QUEUE_SUSPEND)? */ | 248 | * Could we write the value of (SMU_ISR_QUEUE_ERROR | SMU_ISR_QUEUE_SUSPEND)? */ |
249 | writel(0xff, &scic->smu_registers->interrupt_mask); | 249 | writel(0xff, &ihost->smu_registers->interrupt_mask); |
250 | writel(0, &scic->smu_registers->interrupt_mask); | 250 | writel(0, &ihost->smu_registers->interrupt_mask); |
251 | 251 | ||
252 | return false; | 252 | return false; |
253 | } | 253 | } |
254 | 254 | ||
255 | static void scic_sds_controller_task_completion(struct scic_sds_controller *scic, | 255 | static void scic_sds_controller_task_completion(struct isci_host *ihost, |
256 | u32 completion_entry) | 256 | u32 completion_entry) |
257 | { | 257 | { |
258 | u32 index = SCU_GET_COMPLETION_INDEX(completion_entry); | 258 | u32 index = SCU_GET_COMPLETION_INDEX(completion_entry); |
259 | struct isci_host *ihost = scic_to_ihost(scic); | ||
260 | struct isci_request *ireq = ihost->reqs[index]; | 259 | struct isci_request *ireq = ihost->reqs[index]; |
261 | 260 | ||
262 | /* Make sure that we really want to process this IO request */ | 261 | /* Make sure that we really want to process this IO request */ |
263 | if (test_bit(IREQ_ACTIVE, &ireq->flags) && | 262 | if (test_bit(IREQ_ACTIVE, &ireq->flags) && |
264 | ireq->io_tag != SCI_CONTROLLER_INVALID_IO_TAG && | 263 | ireq->io_tag != SCI_CONTROLLER_INVALID_IO_TAG && |
265 | ISCI_TAG_SEQ(ireq->io_tag) == scic->io_request_sequence[index]) | 264 | ISCI_TAG_SEQ(ireq->io_tag) == ihost->io_request_sequence[index]) |
266 | /* Yep this is a valid io request pass it along to the io request handler */ | 265 | /* Yep this is a valid io request pass it along to the io request handler */ |
267 | scic_sds_io_request_tc_completion(ireq, completion_entry); | 266 | scic_sds_io_request_tc_completion(ireq, completion_entry); |
268 | } | 267 | } |
269 | 268 | ||
270 | static void scic_sds_controller_sdma_completion(struct scic_sds_controller *scic, | 269 | static void scic_sds_controller_sdma_completion(struct isci_host *ihost, |
271 | u32 completion_entry) | 270 | u32 completion_entry) |
272 | { | 271 | { |
273 | u32 index; | 272 | u32 index; |
@@ -279,8 +278,8 @@ static void scic_sds_controller_sdma_completion(struct scic_sds_controller *scic | |||
279 | switch (scu_get_command_request_type(completion_entry)) { | 278 | switch (scu_get_command_request_type(completion_entry)) { |
280 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC: | 279 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC: |
281 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC: | 280 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC: |
282 | ireq = scic_to_ihost(scic)->reqs[index]; | 281 | ireq = ihost->reqs[index]; |
283 | dev_warn(scic_to_dev(scic), "%s: %x for io request %p\n", | 282 | dev_warn(&ihost->pdev->dev, "%s: %x for io request %p\n", |
284 | __func__, completion_entry, ireq); | 283 | __func__, completion_entry, ireq); |
285 | /* @todo For a post TC operation we need to fail the IO | 284 | /* @todo For a post TC operation we need to fail the IO |
286 | * request | 285 | * request |
@@ -289,27 +288,26 @@ static void scic_sds_controller_sdma_completion(struct scic_sds_controller *scic | |||
289 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC: | 288 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC: |
290 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC: | 289 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC: |
291 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC: | 290 | case SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC: |
292 | idev = scic->device_table[index]; | 291 | idev = ihost->device_table[index]; |
293 | dev_warn(scic_to_dev(scic), "%s: %x for device %p\n", | 292 | dev_warn(&ihost->pdev->dev, "%s: %x for device %p\n", |
294 | __func__, completion_entry, idev); | 293 | __func__, completion_entry, idev); |
295 | /* @todo For a port RNC operation we need to fail the | 294 | /* @todo For a port RNC operation we need to fail the |
296 | * device | 295 | * device |
297 | */ | 296 | */ |
298 | break; | 297 | break; |
299 | default: | 298 | default: |
300 | dev_warn(scic_to_dev(scic), "%s: unknown completion type %x\n", | 299 | dev_warn(&ihost->pdev->dev, "%s: unknown completion type %x\n", |
301 | __func__, completion_entry); | 300 | __func__, completion_entry); |
302 | break; | 301 | break; |
303 | } | 302 | } |
304 | } | 303 | } |
305 | 304 | ||
306 | static void scic_sds_controller_unsolicited_frame(struct scic_sds_controller *scic, | 305 | static void scic_sds_controller_unsolicited_frame(struct isci_host *ihost, |
307 | u32 completion_entry) | 306 | u32 completion_entry) |
308 | { | 307 | { |
309 | u32 index; | 308 | u32 index; |
310 | u32 frame_index; | 309 | u32 frame_index; |
311 | 310 | ||
312 | struct isci_host *ihost = scic_to_ihost(scic); | ||
313 | struct scu_unsolicited_frame_header *frame_header; | 311 | struct scu_unsolicited_frame_header *frame_header; |
314 | struct isci_phy *iphy; | 312 | struct isci_phy *iphy; |
315 | struct isci_remote_device *idev; | 313 | struct isci_remote_device *idev; |
@@ -318,15 +316,15 @@ static void scic_sds_controller_unsolicited_frame(struct scic_sds_controller *sc | |||
318 | 316 | ||
319 | frame_index = SCU_GET_FRAME_INDEX(completion_entry); | 317 | frame_index = SCU_GET_FRAME_INDEX(completion_entry); |
320 | 318 | ||
321 | frame_header = scic->uf_control.buffers.array[frame_index].header; | 319 | frame_header = ihost->uf_control.buffers.array[frame_index].header; |
322 | scic->uf_control.buffers.array[frame_index].state = UNSOLICITED_FRAME_IN_USE; | 320 | ihost->uf_control.buffers.array[frame_index].state = UNSOLICITED_FRAME_IN_USE; |
323 | 321 | ||
324 | if (SCU_GET_FRAME_ERROR(completion_entry)) { | 322 | if (SCU_GET_FRAME_ERROR(completion_entry)) { |
325 | /* | 323 | /* |
326 | * / @todo If the IAF frame or SIGNATURE FIS frame has an error will | 324 | * / @todo If the IAF frame or SIGNATURE FIS frame has an error will |
327 | * / this cause a problem? We expect the phy initialization will | 325 | * / this cause a problem? We expect the phy initialization will |
328 | * / fail if there is an error in the frame. */ | 326 | * / fail if there is an error in the frame. */ |
329 | scic_sds_controller_release_frame(scic, frame_index); | 327 | scic_sds_controller_release_frame(ihost, frame_index); |
330 | return; | 328 | return; |
331 | } | 329 | } |
332 | 330 | ||
@@ -347,15 +345,15 @@ static void scic_sds_controller_unsolicited_frame(struct scic_sds_controller *sc | |||
347 | iphy = &ihost->phys[index]; | 345 | iphy = &ihost->phys[index]; |
348 | result = scic_sds_phy_frame_handler(iphy, frame_index); | 346 | result = scic_sds_phy_frame_handler(iphy, frame_index); |
349 | } else { | 347 | } else { |
350 | if (index < scic->remote_node_entries) | 348 | if (index < ihost->remote_node_entries) |
351 | idev = scic->device_table[index]; | 349 | idev = ihost->device_table[index]; |
352 | else | 350 | else |
353 | idev = NULL; | 351 | idev = NULL; |
354 | 352 | ||
355 | if (idev != NULL) | 353 | if (idev != NULL) |
356 | result = scic_sds_remote_device_frame_handler(idev, frame_index); | 354 | result = scic_sds_remote_device_frame_handler(idev, frame_index); |
357 | else | 355 | else |
358 | scic_sds_controller_release_frame(scic, frame_index); | 356 | scic_sds_controller_release_frame(ihost, frame_index); |
359 | } | 357 | } |
360 | } | 358 | } |
361 | 359 | ||
@@ -366,10 +364,9 @@ static void scic_sds_controller_unsolicited_frame(struct scic_sds_controller *sc | |||
366 | } | 364 | } |
367 | } | 365 | } |
368 | 366 | ||
369 | static void scic_sds_controller_event_completion(struct scic_sds_controller *scic, | 367 | static void scic_sds_controller_event_completion(struct isci_host *ihost, |
370 | u32 completion_entry) | 368 | u32 completion_entry) |
371 | { | 369 | { |
372 | struct isci_host *ihost = scic_to_ihost(scic); | ||
373 | struct isci_remote_device *idev; | 370 | struct isci_remote_device *idev; |
374 | struct isci_request *ireq; | 371 | struct isci_request *ireq; |
375 | struct isci_phy *iphy; | 372 | struct isci_phy *iphy; |
@@ -380,11 +377,11 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci | |||
380 | switch (scu_get_event_type(completion_entry)) { | 377 | switch (scu_get_event_type(completion_entry)) { |
381 | case SCU_EVENT_TYPE_SMU_COMMAND_ERROR: | 378 | case SCU_EVENT_TYPE_SMU_COMMAND_ERROR: |
382 | /* / @todo The driver did something wrong and we need to fix the condtion. */ | 379 | /* / @todo The driver did something wrong and we need to fix the condtion. */ |
383 | dev_err(scic_to_dev(scic), | 380 | dev_err(&ihost->pdev->dev, |
384 | "%s: SCIC Controller 0x%p received SMU command error " | 381 | "%s: SCIC Controller 0x%p received SMU command error " |
385 | "0x%x\n", | 382 | "0x%x\n", |
386 | __func__, | 383 | __func__, |
387 | scic, | 384 | ihost, |
388 | completion_entry); | 385 | completion_entry); |
389 | break; | 386 | break; |
390 | 387 | ||
@@ -394,11 +391,11 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci | |||
394 | /* | 391 | /* |
395 | * / @todo This is a hardware failure and its likely that we want to | 392 | * / @todo This is a hardware failure and its likely that we want to |
396 | * / reset the controller. */ | 393 | * / reset the controller. */ |
397 | dev_err(scic_to_dev(scic), | 394 | dev_err(&ihost->pdev->dev, |
398 | "%s: SCIC Controller 0x%p received fatal controller " | 395 | "%s: SCIC Controller 0x%p received fatal controller " |
399 | "event 0x%x\n", | 396 | "event 0x%x\n", |
400 | __func__, | 397 | __func__, |
401 | scic, | 398 | ihost, |
402 | completion_entry); | 399 | completion_entry); |
403 | break; | 400 | break; |
404 | 401 | ||
@@ -415,27 +412,27 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci | |||
415 | if (ireq != NULL) | 412 | if (ireq != NULL) |
416 | scic_sds_io_request_event_handler(ireq, completion_entry); | 413 | scic_sds_io_request_event_handler(ireq, completion_entry); |
417 | else | 414 | else |
418 | dev_warn(scic_to_dev(scic), | 415 | dev_warn(&ihost->pdev->dev, |
419 | "%s: SCIC Controller 0x%p received " | 416 | "%s: SCIC Controller 0x%p received " |
420 | "event 0x%x for io request object " | 417 | "event 0x%x for io request object " |
421 | "that doesnt exist.\n", | 418 | "that doesnt exist.\n", |
422 | __func__, | 419 | __func__, |
423 | scic, | 420 | ihost, |
424 | completion_entry); | 421 | completion_entry); |
425 | 422 | ||
426 | break; | 423 | break; |
427 | 424 | ||
428 | case SCU_EVENT_SPECIFIC_IT_NEXUS_TIMEOUT: | 425 | case SCU_EVENT_SPECIFIC_IT_NEXUS_TIMEOUT: |
429 | idev = scic->device_table[index]; | 426 | idev = ihost->device_table[index]; |
430 | if (idev != NULL) | 427 | if (idev != NULL) |
431 | scic_sds_remote_device_event_handler(idev, completion_entry); | 428 | scic_sds_remote_device_event_handler(idev, completion_entry); |
432 | else | 429 | else |
433 | dev_warn(scic_to_dev(scic), | 430 | dev_warn(&ihost->pdev->dev, |
434 | "%s: SCIC Controller 0x%p received " | 431 | "%s: SCIC Controller 0x%p received " |
435 | "event 0x%x for remote device object " | 432 | "event 0x%x for remote device object " |
436 | "that doesnt exist.\n", | 433 | "that doesnt exist.\n", |
437 | __func__, | 434 | __func__, |
438 | scic, | 435 | ihost, |
439 | completion_entry); | 436 | completion_entry); |
440 | 437 | ||
441 | break; | 438 | break; |
@@ -459,25 +456,25 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci | |||
459 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX: | 456 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX: |
460 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: | 457 | case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: |
461 | case SCU_EVENT_TYPE_RNC_OPS_MISC: | 458 | case SCU_EVENT_TYPE_RNC_OPS_MISC: |
462 | if (index < scic->remote_node_entries) { | 459 | if (index < ihost->remote_node_entries) { |
463 | idev = scic->device_table[index]; | 460 | idev = ihost->device_table[index]; |
464 | 461 | ||
465 | if (idev != NULL) | 462 | if (idev != NULL) |
466 | scic_sds_remote_device_event_handler(idev, completion_entry); | 463 | scic_sds_remote_device_event_handler(idev, completion_entry); |
467 | } else | 464 | } else |
468 | dev_err(scic_to_dev(scic), | 465 | dev_err(&ihost->pdev->dev, |
469 | "%s: SCIC Controller 0x%p received event 0x%x " | 466 | "%s: SCIC Controller 0x%p received event 0x%x " |
470 | "for remote device object 0x%0x that doesnt " | 467 | "for remote device object 0x%0x that doesnt " |
471 | "exist.\n", | 468 | "exist.\n", |
472 | __func__, | 469 | __func__, |
473 | scic, | 470 | ihost, |
474 | completion_entry, | 471 | completion_entry, |
475 | index); | 472 | index); |
476 | 473 | ||
477 | break; | 474 | break; |
478 | 475 | ||
479 | default: | 476 | default: |
480 | dev_warn(scic_to_dev(scic), | 477 | dev_warn(&ihost->pdev->dev, |
481 | "%s: SCIC Controller received unknown event code %x\n", | 478 | "%s: SCIC Controller received unknown event code %x\n", |
482 | __func__, | 479 | __func__, |
483 | completion_entry); | 480 | completion_entry); |
@@ -485,7 +482,7 @@ static void scic_sds_controller_event_completion(struct scic_sds_controller *sci | |||
485 | } | 482 | } |
486 | } | 483 | } |
487 | 484 | ||
488 | static void scic_sds_controller_process_completions(struct scic_sds_controller *scic) | 485 | static void scic_sds_controller_process_completions(struct isci_host *ihost) |
489 | { | 486 | { |
490 | u32 completion_count = 0; | 487 | u32 completion_count = 0; |
491 | u32 completion_entry; | 488 | u32 completion_entry; |
@@ -494,47 +491,47 @@ static void scic_sds_controller_process_completions(struct scic_sds_controller * | |||
494 | u32 event_get; | 491 | u32 event_get; |
495 | u32 event_cycle; | 492 | u32 event_cycle; |
496 | 493 | ||
497 | dev_dbg(scic_to_dev(scic), | 494 | dev_dbg(&ihost->pdev->dev, |
498 | "%s: completion queue begining get:0x%08x\n", | 495 | "%s: completion queue begining get:0x%08x\n", |
499 | __func__, | 496 | __func__, |
500 | scic->completion_queue_get); | 497 | ihost->completion_queue_get); |
501 | 498 | ||
502 | /* Get the component parts of the completion queue */ | 499 | /* Get the component parts of the completion queue */ |
503 | get_index = NORMALIZE_GET_POINTER(scic->completion_queue_get); | 500 | get_index = NORMALIZE_GET_POINTER(ihost->completion_queue_get); |
504 | get_cycle = SMU_CQGR_CYCLE_BIT & scic->completion_queue_get; | 501 | get_cycle = SMU_CQGR_CYCLE_BIT & ihost->completion_queue_get; |
505 | 502 | ||
506 | event_get = NORMALIZE_EVENT_POINTER(scic->completion_queue_get); | 503 | event_get = NORMALIZE_EVENT_POINTER(ihost->completion_queue_get); |
507 | event_cycle = SMU_CQGR_EVENT_CYCLE_BIT & scic->completion_queue_get; | 504 | event_cycle = SMU_CQGR_EVENT_CYCLE_BIT & ihost->completion_queue_get; |
508 | 505 | ||
509 | while ( | 506 | while ( |
510 | NORMALIZE_GET_POINTER_CYCLE_BIT(get_cycle) | 507 | NORMALIZE_GET_POINTER_CYCLE_BIT(get_cycle) |
511 | == COMPLETION_QUEUE_CYCLE_BIT(scic->completion_queue[get_index]) | 508 | == COMPLETION_QUEUE_CYCLE_BIT(ihost->completion_queue[get_index]) |
512 | ) { | 509 | ) { |
513 | completion_count++; | 510 | completion_count++; |
514 | 511 | ||
515 | completion_entry = scic->completion_queue[get_index]; | 512 | completion_entry = ihost->completion_queue[get_index]; |
516 | 513 | ||
517 | /* increment the get pointer and check for rollover to toggle the cycle bit */ | 514 | /* increment the get pointer and check for rollover to toggle the cycle bit */ |
518 | get_cycle ^= ((get_index+1) & SCU_MAX_COMPLETION_QUEUE_ENTRIES) << | 515 | get_cycle ^= ((get_index+1) & SCU_MAX_COMPLETION_QUEUE_ENTRIES) << |
519 | (SMU_COMPLETION_QUEUE_GET_CYCLE_BIT_SHIFT - SCU_MAX_COMPLETION_QUEUE_SHIFT); | 516 | (SMU_COMPLETION_QUEUE_GET_CYCLE_BIT_SHIFT - SCU_MAX_COMPLETION_QUEUE_SHIFT); |
520 | get_index = (get_index+1) & (SCU_MAX_COMPLETION_QUEUE_ENTRIES-1); | 517 | get_index = (get_index+1) & (SCU_MAX_COMPLETION_QUEUE_ENTRIES-1); |
521 | 518 | ||
522 | dev_dbg(scic_to_dev(scic), | 519 | dev_dbg(&ihost->pdev->dev, |
523 | "%s: completion queue entry:0x%08x\n", | 520 | "%s: completion queue entry:0x%08x\n", |
524 | __func__, | 521 | __func__, |
525 | completion_entry); | 522 | completion_entry); |
526 | 523 | ||
527 | switch (SCU_GET_COMPLETION_TYPE(completion_entry)) { | 524 | switch (SCU_GET_COMPLETION_TYPE(completion_entry)) { |
528 | case SCU_COMPLETION_TYPE_TASK: | 525 | case SCU_COMPLETION_TYPE_TASK: |
529 | scic_sds_controller_task_completion(scic, completion_entry); | 526 | scic_sds_controller_task_completion(ihost, completion_entry); |
530 | break; | 527 | break; |
531 | 528 | ||
532 | case SCU_COMPLETION_TYPE_SDMA: | 529 | case SCU_COMPLETION_TYPE_SDMA: |
533 | scic_sds_controller_sdma_completion(scic, completion_entry); | 530 | scic_sds_controller_sdma_completion(ihost, completion_entry); |
534 | break; | 531 | break; |
535 | 532 | ||
536 | case SCU_COMPLETION_TYPE_UFI: | 533 | case SCU_COMPLETION_TYPE_UFI: |
537 | scic_sds_controller_unsolicited_frame(scic, completion_entry); | 534 | scic_sds_controller_unsolicited_frame(ihost, completion_entry); |
538 | break; | 535 | break; |
539 | 536 | ||
540 | case SCU_COMPLETION_TYPE_EVENT: | 537 | case SCU_COMPLETION_TYPE_EVENT: |
@@ -543,11 +540,11 @@ static void scic_sds_controller_process_completions(struct scic_sds_controller * | |||
543 | (SMU_COMPLETION_QUEUE_GET_EVENT_CYCLE_BIT_SHIFT - SCU_MAX_EVENTS_SHIFT); | 540 | (SMU_COMPLETION_QUEUE_GET_EVENT_CYCLE_BIT_SHIFT - SCU_MAX_EVENTS_SHIFT); |
544 | event_get = (event_get+1) & (SCU_MAX_EVENTS-1); | 541 | event_get = (event_get+1) & (SCU_MAX_EVENTS-1); |
545 | 542 | ||
546 | scic_sds_controller_event_completion(scic, completion_entry); | 543 | scic_sds_controller_event_completion(ihost, completion_entry); |
547 | break; | 544 | break; |
548 | } | 545 | } |
549 | default: | 546 | default: |
550 | dev_warn(scic_to_dev(scic), | 547 | dev_warn(&ihost->pdev->dev, |
551 | "%s: SCIC Controller received unknown " | 548 | "%s: SCIC Controller received unknown " |
552 | "completion type %x\n", | 549 | "completion type %x\n", |
553 | __func__, | 550 | __func__, |
@@ -558,7 +555,7 @@ static void scic_sds_controller_process_completions(struct scic_sds_controller * | |||
558 | 555 | ||
559 | /* Update the get register if we completed one or more entries */ | 556 | /* Update the get register if we completed one or more entries */ |
560 | if (completion_count > 0) { | 557 | if (completion_count > 0) { |
561 | scic->completion_queue_get = | 558 | ihost->completion_queue_get = |
562 | SMU_CQGR_GEN_BIT(ENABLE) | | 559 | SMU_CQGR_GEN_BIT(ENABLE) | |
563 | SMU_CQGR_GEN_BIT(EVENT_ENABLE) | | 560 | SMU_CQGR_GEN_BIT(EVENT_ENABLE) | |
564 | event_cycle | | 561 | event_cycle | |
@@ -566,35 +563,35 @@ static void scic_sds_controller_process_completions(struct scic_sds_controller * | |||
566 | get_cycle | | 563 | get_cycle | |
567 | SMU_CQGR_GEN_VAL(POINTER, get_index); | 564 | SMU_CQGR_GEN_VAL(POINTER, get_index); |
568 | 565 | ||
569 | writel(scic->completion_queue_get, | 566 | writel(ihost->completion_queue_get, |
570 | &scic->smu_registers->completion_queue_get); | 567 | &ihost->smu_registers->completion_queue_get); |
571 | 568 | ||
572 | } | 569 | } |
573 | 570 | ||
574 | dev_dbg(scic_to_dev(scic), | 571 | dev_dbg(&ihost->pdev->dev, |
575 | "%s: completion queue ending get:0x%08x\n", | 572 | "%s: completion queue ending get:0x%08x\n", |
576 | __func__, | 573 | __func__, |
577 | scic->completion_queue_get); | 574 | ihost->completion_queue_get); |
578 | 575 | ||
579 | } | 576 | } |
580 | 577 | ||
581 | static void scic_sds_controller_error_handler(struct scic_sds_controller *scic) | 578 | static void scic_sds_controller_error_handler(struct isci_host *ihost) |
582 | { | 579 | { |
583 | u32 interrupt_status; | 580 | u32 interrupt_status; |
584 | 581 | ||
585 | interrupt_status = | 582 | interrupt_status = |
586 | readl(&scic->smu_registers->interrupt_status); | 583 | readl(&ihost->smu_registers->interrupt_status); |
587 | 584 | ||
588 | if ((interrupt_status & SMU_ISR_QUEUE_SUSPEND) && | 585 | if ((interrupt_status & SMU_ISR_QUEUE_SUSPEND) && |
589 | scic_sds_controller_completion_queue_has_entries(scic)) { | 586 | scic_sds_controller_completion_queue_has_entries(ihost)) { |
590 | 587 | ||
591 | scic_sds_controller_process_completions(scic); | 588 | scic_sds_controller_process_completions(ihost); |
592 | writel(SMU_ISR_QUEUE_SUSPEND, &scic->smu_registers->interrupt_status); | 589 | writel(SMU_ISR_QUEUE_SUSPEND, &ihost->smu_registers->interrupt_status); |
593 | } else { | 590 | } else { |
594 | dev_err(scic_to_dev(scic), "%s: status: %#x\n", __func__, | 591 | dev_err(&ihost->pdev->dev, "%s: status: %#x\n", __func__, |
595 | interrupt_status); | 592 | interrupt_status); |
596 | 593 | ||
597 | sci_change_state(&scic->sm, SCIC_FAILED); | 594 | sci_change_state(&ihost->sm, SCIC_FAILED); |
598 | 595 | ||
599 | return; | 596 | return; |
600 | } | 597 | } |
@@ -602,22 +599,21 @@ static void scic_sds_controller_error_handler(struct scic_sds_controller *scic) | |||
602 | /* If we dont process any completions I am not sure that we want to do this. | 599 | /* If we dont process any completions I am not sure that we want to do this. |
603 | * We are in the middle of a hardware fault and should probably be reset. | 600 | * We are in the middle of a hardware fault and should probably be reset. |
604 | */ | 601 | */ |
605 | writel(0, &scic->smu_registers->interrupt_mask); | 602 | writel(0, &ihost->smu_registers->interrupt_mask); |
606 | } | 603 | } |
607 | 604 | ||
608 | irqreturn_t isci_intx_isr(int vec, void *data) | 605 | irqreturn_t isci_intx_isr(int vec, void *data) |
609 | { | 606 | { |
610 | irqreturn_t ret = IRQ_NONE; | 607 | irqreturn_t ret = IRQ_NONE; |
611 | struct isci_host *ihost = data; | 608 | struct isci_host *ihost = data; |
612 | struct scic_sds_controller *scic = &ihost->sci; | ||
613 | 609 | ||
614 | if (scic_sds_controller_isr(scic)) { | 610 | if (scic_sds_controller_isr(ihost)) { |
615 | writel(SMU_ISR_COMPLETION, &scic->smu_registers->interrupt_status); | 611 | writel(SMU_ISR_COMPLETION, &ihost->smu_registers->interrupt_status); |
616 | tasklet_schedule(&ihost->completion_tasklet); | 612 | tasklet_schedule(&ihost->completion_tasklet); |
617 | ret = IRQ_HANDLED; | 613 | ret = IRQ_HANDLED; |
618 | } else if (scic_sds_controller_error_isr(scic)) { | 614 | } else if (scic_sds_controller_error_isr(ihost)) { |
619 | spin_lock(&ihost->scic_lock); | 615 | spin_lock(&ihost->scic_lock); |
620 | scic_sds_controller_error_handler(scic); | 616 | scic_sds_controller_error_handler(ihost); |
621 | spin_unlock(&ihost->scic_lock); | 617 | spin_unlock(&ihost->scic_lock); |
622 | ret = IRQ_HANDLED; | 618 | ret = IRQ_HANDLED; |
623 | } | 619 | } |
@@ -629,8 +625,8 @@ irqreturn_t isci_error_isr(int vec, void *data) | |||
629 | { | 625 | { |
630 | struct isci_host *ihost = data; | 626 | struct isci_host *ihost = data; |
631 | 627 | ||
632 | if (scic_sds_controller_error_isr(&ihost->sci)) | 628 | if (scic_sds_controller_error_isr(ihost)) |
633 | scic_sds_controller_error_handler(&ihost->sci); | 629 | scic_sds_controller_error_handler(ihost); |
634 | 630 | ||
635 | return IRQ_HANDLED; | 631 | return IRQ_HANDLED; |
636 | } | 632 | } |
@@ -685,11 +681,10 @@ int isci_host_scan_finished(struct Scsi_Host *shost, unsigned long time) | |||
685 | * This method returns the number of milliseconds for the suggested start | 681 | * This method returns the number of milliseconds for the suggested start |
686 | * operation timeout. | 682 | * operation timeout. |
687 | */ | 683 | */ |
688 | static u32 scic_controller_get_suggested_start_timeout( | 684 | static u32 scic_controller_get_suggested_start_timeout(struct isci_host *ihost) |
689 | struct scic_sds_controller *sc) | ||
690 | { | 685 | { |
691 | /* Validate the user supplied parameters. */ | 686 | /* Validate the user supplied parameters. */ |
692 | if (sc == NULL) | 687 | if (!ihost) |
693 | return 0; | 688 | return 0; |
694 | 689 | ||
695 | /* | 690 | /* |
@@ -711,35 +706,32 @@ static u32 scic_controller_get_suggested_start_timeout( | |||
711 | + ((SCI_MAX_PHYS - 1) * SCIC_SDS_CONTROLLER_POWER_CONTROL_INTERVAL); | 706 | + ((SCI_MAX_PHYS - 1) * SCIC_SDS_CONTROLLER_POWER_CONTROL_INTERVAL); |
712 | } | 707 | } |
713 | 708 | ||
714 | static void scic_controller_enable_interrupts( | 709 | static void scic_controller_enable_interrupts(struct isci_host *ihost) |
715 | struct scic_sds_controller *scic) | ||
716 | { | 710 | { |
717 | BUG_ON(scic->smu_registers == NULL); | 711 | BUG_ON(ihost->smu_registers == NULL); |
718 | writel(0, &scic->smu_registers->interrupt_mask); | 712 | writel(0, &ihost->smu_registers->interrupt_mask); |
719 | } | 713 | } |
720 | 714 | ||
721 | void scic_controller_disable_interrupts( | 715 | void scic_controller_disable_interrupts(struct isci_host *ihost) |
722 | struct scic_sds_controller *scic) | ||
723 | { | 716 | { |
724 | BUG_ON(scic->smu_registers == NULL); | 717 | BUG_ON(ihost->smu_registers == NULL); |
725 | writel(0xffffffff, &scic->smu_registers->interrupt_mask); | 718 | writel(0xffffffff, &ihost->smu_registers->interrupt_mask); |
726 | } | 719 | } |
727 | 720 | ||
728 | static void scic_sds_controller_enable_port_task_scheduler( | 721 | static void scic_sds_controller_enable_port_task_scheduler(struct isci_host *ihost) |
729 | struct scic_sds_controller *scic) | ||
730 | { | 722 | { |
731 | u32 port_task_scheduler_value; | 723 | u32 port_task_scheduler_value; |
732 | 724 | ||
733 | port_task_scheduler_value = | 725 | port_task_scheduler_value = |
734 | readl(&scic->scu_registers->peg0.ptsg.control); | 726 | readl(&ihost->scu_registers->peg0.ptsg.control); |
735 | port_task_scheduler_value |= | 727 | port_task_scheduler_value |= |
736 | (SCU_PTSGCR_GEN_BIT(ETM_ENABLE) | | 728 | (SCU_PTSGCR_GEN_BIT(ETM_ENABLE) | |
737 | SCU_PTSGCR_GEN_BIT(PTSG_ENABLE)); | 729 | SCU_PTSGCR_GEN_BIT(PTSG_ENABLE)); |
738 | writel(port_task_scheduler_value, | 730 | writel(port_task_scheduler_value, |
739 | &scic->scu_registers->peg0.ptsg.control); | 731 | &ihost->scu_registers->peg0.ptsg.control); |
740 | } | 732 | } |
741 | 733 | ||
742 | static void scic_sds_controller_assign_task_entries(struct scic_sds_controller *scic) | 734 | static void scic_sds_controller_assign_task_entries(struct isci_host *ihost) |
743 | { | 735 | { |
744 | u32 task_assignment; | 736 | u32 task_assignment; |
745 | 737 | ||
@@ -749,32 +741,32 @@ static void scic_sds_controller_assign_task_entries(struct scic_sds_controller * | |||
749 | */ | 741 | */ |
750 | 742 | ||
751 | task_assignment = | 743 | task_assignment = |
752 | readl(&scic->smu_registers->task_context_assignment[0]); | 744 | readl(&ihost->smu_registers->task_context_assignment[0]); |
753 | 745 | ||
754 | task_assignment |= (SMU_TCA_GEN_VAL(STARTING, 0)) | | 746 | task_assignment |= (SMU_TCA_GEN_VAL(STARTING, 0)) | |
755 | (SMU_TCA_GEN_VAL(ENDING, scic->task_context_entries - 1)) | | 747 | (SMU_TCA_GEN_VAL(ENDING, ihost->task_context_entries - 1)) | |
756 | (SMU_TCA_GEN_BIT(RANGE_CHECK_ENABLE)); | 748 | (SMU_TCA_GEN_BIT(RANGE_CHECK_ENABLE)); |
757 | 749 | ||
758 | writel(task_assignment, | 750 | writel(task_assignment, |
759 | &scic->smu_registers->task_context_assignment[0]); | 751 | &ihost->smu_registers->task_context_assignment[0]); |
760 | 752 | ||
761 | } | 753 | } |
762 | 754 | ||
763 | static void scic_sds_controller_initialize_completion_queue(struct scic_sds_controller *scic) | 755 | static void scic_sds_controller_initialize_completion_queue(struct isci_host *ihost) |
764 | { | 756 | { |
765 | u32 index; | 757 | u32 index; |
766 | u32 completion_queue_control_value; | 758 | u32 completion_queue_control_value; |
767 | u32 completion_queue_get_value; | 759 | u32 completion_queue_get_value; |
768 | u32 completion_queue_put_value; | 760 | u32 completion_queue_put_value; |
769 | 761 | ||
770 | scic->completion_queue_get = 0; | 762 | ihost->completion_queue_get = 0; |
771 | 763 | ||
772 | completion_queue_control_value = | 764 | completion_queue_control_value = |
773 | (SMU_CQC_QUEUE_LIMIT_SET(SCU_MAX_COMPLETION_QUEUE_ENTRIES - 1) | | 765 | (SMU_CQC_QUEUE_LIMIT_SET(SCU_MAX_COMPLETION_QUEUE_ENTRIES - 1) | |
774 | SMU_CQC_EVENT_LIMIT_SET(SCU_MAX_EVENTS - 1)); | 766 | SMU_CQC_EVENT_LIMIT_SET(SCU_MAX_EVENTS - 1)); |
775 | 767 | ||
776 | writel(completion_queue_control_value, | 768 | writel(completion_queue_control_value, |
777 | &scic->smu_registers->completion_queue_control); | 769 | &ihost->smu_registers->completion_queue_control); |
778 | 770 | ||
779 | 771 | ||
780 | /* Set the completion queue get pointer and enable the queue */ | 772 | /* Set the completion queue get pointer and enable the queue */ |
@@ -786,7 +778,7 @@ static void scic_sds_controller_initialize_completion_queue(struct scic_sds_cont | |||
786 | ); | 778 | ); |
787 | 779 | ||
788 | writel(completion_queue_get_value, | 780 | writel(completion_queue_get_value, |
789 | &scic->smu_registers->completion_queue_get); | 781 | &ihost->smu_registers->completion_queue_get); |
790 | 782 | ||
791 | /* Set the completion queue put pointer */ | 783 | /* Set the completion queue put pointer */ |
792 | completion_queue_put_value = ( | 784 | completion_queue_put_value = ( |
@@ -795,7 +787,7 @@ static void scic_sds_controller_initialize_completion_queue(struct scic_sds_cont | |||
795 | ); | 787 | ); |
796 | 788 | ||
797 | writel(completion_queue_put_value, | 789 | writel(completion_queue_put_value, |
798 | &scic->smu_registers->completion_queue_put); | 790 | &ihost->smu_registers->completion_queue_put); |
799 | 791 | ||
800 | /* Initialize the cycle bit of the completion queue entries */ | 792 | /* Initialize the cycle bit of the completion queue entries */ |
801 | for (index = 0; index < SCU_MAX_COMPLETION_QUEUE_ENTRIES; index++) { | 793 | for (index = 0; index < SCU_MAX_COMPLETION_QUEUE_ENTRIES; index++) { |
@@ -803,11 +795,11 @@ static void scic_sds_controller_initialize_completion_queue(struct scic_sds_cont | |||
803 | * If get.cycle_bit != completion_queue.cycle_bit | 795 | * If get.cycle_bit != completion_queue.cycle_bit |
804 | * its not a valid completion queue entry | 796 | * its not a valid completion queue entry |
805 | * so at system start all entries are invalid */ | 797 | * so at system start all entries are invalid */ |
806 | scic->completion_queue[index] = 0x80000000; | 798 | ihost->completion_queue[index] = 0x80000000; |
807 | } | 799 | } |
808 | } | 800 | } |
809 | 801 | ||
810 | static void scic_sds_controller_initialize_unsolicited_frame_queue(struct scic_sds_controller *scic) | 802 | static void scic_sds_controller_initialize_unsolicited_frame_queue(struct isci_host *ihost) |
811 | { | 803 | { |
812 | u32 frame_queue_control_value; | 804 | u32 frame_queue_control_value; |
813 | u32 frame_queue_get_value; | 805 | u32 frame_queue_get_value; |
@@ -818,7 +810,7 @@ static void scic_sds_controller_initialize_unsolicited_frame_queue(struct scic_s | |||
818 | SCU_UFQC_GEN_VAL(QUEUE_SIZE, SCU_MAX_UNSOLICITED_FRAMES); | 810 | SCU_UFQC_GEN_VAL(QUEUE_SIZE, SCU_MAX_UNSOLICITED_FRAMES); |
819 | 811 | ||
820 | writel(frame_queue_control_value, | 812 | writel(frame_queue_control_value, |
821 | &scic->scu_registers->sdma.unsolicited_frame_queue_control); | 813 | &ihost->scu_registers->sdma.unsolicited_frame_queue_control); |
822 | 814 | ||
823 | /* Setup the get pointer for the unsolicited frame queue */ | 815 | /* Setup the get pointer for the unsolicited frame queue */ |
824 | frame_queue_get_value = ( | 816 | frame_queue_get_value = ( |
@@ -827,11 +819,11 @@ static void scic_sds_controller_initialize_unsolicited_frame_queue(struct scic_s | |||
827 | ); | 819 | ); |
828 | 820 | ||
829 | writel(frame_queue_get_value, | 821 | writel(frame_queue_get_value, |
830 | &scic->scu_registers->sdma.unsolicited_frame_get_pointer); | 822 | &ihost->scu_registers->sdma.unsolicited_frame_get_pointer); |
831 | /* Setup the put pointer for the unsolicited frame queue */ | 823 | /* Setup the put pointer for the unsolicited frame queue */ |
832 | frame_queue_put_value = SCU_UFQPP_GEN_VAL(POINTER, 0); | 824 | frame_queue_put_value = SCU_UFQPP_GEN_VAL(POINTER, 0); |
833 | writel(frame_queue_put_value, | 825 | writel(frame_queue_put_value, |
834 | &scic->scu_registers->sdma.unsolicited_frame_put_pointer); | 826 | &ihost->scu_registers->sdma.unsolicited_frame_put_pointer); |
835 | } | 827 | } |
836 | 828 | ||
837 | /** | 829 | /** |
@@ -846,17 +838,16 @@ static void scic_sds_controller_initialize_unsolicited_frame_queue(struct scic_s | |||
846 | * none. | 838 | * none. |
847 | */ | 839 | */ |
848 | static void scic_sds_controller_transition_to_ready( | 840 | static void scic_sds_controller_transition_to_ready( |
849 | struct scic_sds_controller *scic, | 841 | struct isci_host *ihost, |
850 | enum sci_status status) | 842 | enum sci_status status) |
851 | { | 843 | { |
852 | struct isci_host *ihost = scic_to_ihost(scic); | ||
853 | 844 | ||
854 | if (scic->sm.current_state_id == SCIC_STARTING) { | 845 | if (ihost->sm.current_state_id == SCIC_STARTING) { |
855 | /* | 846 | /* |
856 | * We move into the ready state, because some of the phys/ports | 847 | * We move into the ready state, because some of the phys/ports |
857 | * may be up and operational. | 848 | * may be up and operational. |
858 | */ | 849 | */ |
859 | sci_change_state(&scic->sm, SCIC_READY); | 850 | sci_change_state(&ihost->sm, SCIC_READY); |
860 | 851 | ||
861 | isci_host_start_complete(ihost, status); | 852 | isci_host_start_complete(ihost, status); |
862 | } | 853 | } |
@@ -892,19 +883,18 @@ static bool is_phy_starting(struct isci_phy *iphy) | |||
892 | * controller to the READY state and inform the user | 883 | * controller to the READY state and inform the user |
893 | * (scic_cb_controller_start_complete()). | 884 | * (scic_cb_controller_start_complete()). |
894 | */ | 885 | */ |
895 | static enum sci_status scic_sds_controller_start_next_phy(struct scic_sds_controller *scic) | 886 | static enum sci_status scic_sds_controller_start_next_phy(struct isci_host *ihost) |
896 | { | 887 | { |
897 | struct isci_host *ihost = scic_to_ihost(scic); | 888 | struct scic_sds_oem_params *oem = &ihost->oem_parameters.sds1; |
898 | struct scic_sds_oem_params *oem = &scic->oem_parameters.sds1; | ||
899 | struct isci_phy *iphy; | 889 | struct isci_phy *iphy; |
900 | enum sci_status status; | 890 | enum sci_status status; |
901 | 891 | ||
902 | status = SCI_SUCCESS; | 892 | status = SCI_SUCCESS; |
903 | 893 | ||
904 | if (scic->phy_startup_timer_pending) | 894 | if (ihost->phy_startup_timer_pending) |
905 | return status; | 895 | return status; |
906 | 896 | ||
907 | if (scic->next_phy_to_start >= SCI_MAX_PHYS) { | 897 | if (ihost->next_phy_to_start >= SCI_MAX_PHYS) { |
908 | bool is_controller_start_complete = true; | 898 | bool is_controller_start_complete = true; |
909 | u32 state; | 899 | u32 state; |
910 | u8 index; | 900 | u8 index; |
@@ -934,16 +924,16 @@ static enum sci_status scic_sds_controller_start_next_phy(struct scic_sds_contro | |||
934 | * The controller has successfully finished the start process. | 924 | * The controller has successfully finished the start process. |
935 | * Inform the SCI Core user and transition to the READY state. */ | 925 | * Inform the SCI Core user and transition to the READY state. */ |
936 | if (is_controller_start_complete == true) { | 926 | if (is_controller_start_complete == true) { |
937 | scic_sds_controller_transition_to_ready(scic, SCI_SUCCESS); | 927 | scic_sds_controller_transition_to_ready(ihost, SCI_SUCCESS); |
938 | sci_del_timer(&scic->phy_timer); | 928 | sci_del_timer(&ihost->phy_timer); |
939 | scic->phy_startup_timer_pending = false; | 929 | ihost->phy_startup_timer_pending = false; |
940 | } | 930 | } |
941 | } else { | 931 | } else { |
942 | iphy = &ihost->phys[scic->next_phy_to_start]; | 932 | iphy = &ihost->phys[ihost->next_phy_to_start]; |
943 | 933 | ||
944 | if (oem->controller.mode_type == SCIC_PORT_MANUAL_CONFIGURATION_MODE) { | 934 | if (oem->controller.mode_type == SCIC_PORT_MANUAL_CONFIGURATION_MODE) { |
945 | if (phy_get_non_dummy_port(iphy) == NULL) { | 935 | if (phy_get_non_dummy_port(iphy) == NULL) { |
946 | scic->next_phy_to_start++; | 936 | ihost->next_phy_to_start++; |
947 | 937 | ||
948 | /* Caution recursion ahead be forwarned | 938 | /* Caution recursion ahead be forwarned |
949 | * | 939 | * |
@@ -954,27 +944,27 @@ static enum sci_status scic_sds_controller_start_next_phy(struct scic_sds_contro | |||
954 | * incorrectly for the PORT or it was never | 944 | * incorrectly for the PORT or it was never |
955 | * assigned to a PORT | 945 | * assigned to a PORT |
956 | */ | 946 | */ |
957 | return scic_sds_controller_start_next_phy(scic); | 947 | return scic_sds_controller_start_next_phy(ihost); |
958 | } | 948 | } |
959 | } | 949 | } |
960 | 950 | ||
961 | status = scic_sds_phy_start(iphy); | 951 | status = scic_sds_phy_start(iphy); |
962 | 952 | ||
963 | if (status == SCI_SUCCESS) { | 953 | if (status == SCI_SUCCESS) { |
964 | sci_mod_timer(&scic->phy_timer, | 954 | sci_mod_timer(&ihost->phy_timer, |
965 | SCIC_SDS_CONTROLLER_PHY_START_TIMEOUT); | 955 | SCIC_SDS_CONTROLLER_PHY_START_TIMEOUT); |
966 | scic->phy_startup_timer_pending = true; | 956 | ihost->phy_startup_timer_pending = true; |
967 | } else { | 957 | } else { |
968 | dev_warn(scic_to_dev(scic), | 958 | dev_warn(&ihost->pdev->dev, |
969 | "%s: Controller stop operation failed " | 959 | "%s: Controller stop operation failed " |
970 | "to stop phy %d because of status " | 960 | "to stop phy %d because of status " |
971 | "%d.\n", | 961 | "%d.\n", |
972 | __func__, | 962 | __func__, |
973 | ihost->phys[scic->next_phy_to_start].phy_index, | 963 | ihost->phys[ihost->next_phy_to_start].phy_index, |
974 | status); | 964 | status); |
975 | } | 965 | } |
976 | 966 | ||
977 | scic->next_phy_to_start++; | 967 | ihost->next_phy_to_start++; |
978 | } | 968 | } |
979 | 969 | ||
980 | return status; | 970 | return status; |
@@ -983,8 +973,7 @@ static enum sci_status scic_sds_controller_start_next_phy(struct scic_sds_contro | |||
983 | static void phy_startup_timeout(unsigned long data) | 973 | static void phy_startup_timeout(unsigned long data) |
984 | { | 974 | { |
985 | struct sci_timer *tmr = (struct sci_timer *)data; | 975 | struct sci_timer *tmr = (struct sci_timer *)data; |
986 | struct scic_sds_controller *scic = container_of(tmr, typeof(*scic), phy_timer); | 976 | struct isci_host *ihost = container_of(tmr, typeof(*ihost), phy_timer); |
987 | struct isci_host *ihost = scic_to_ihost(scic); | ||
988 | unsigned long flags; | 977 | unsigned long flags; |
989 | enum sci_status status; | 978 | enum sci_status status; |
990 | 979 | ||
@@ -993,10 +982,10 @@ static void phy_startup_timeout(unsigned long data) | |||
993 | if (tmr->cancel) | 982 | if (tmr->cancel) |
994 | goto done; | 983 | goto done; |
995 | 984 | ||
996 | scic->phy_startup_timer_pending = false; | 985 | ihost->phy_startup_timer_pending = false; |
997 | 986 | ||
998 | do { | 987 | do { |
999 | status = scic_sds_controller_start_next_phy(scic); | 988 | status = scic_sds_controller_start_next_phy(ihost); |
1000 | } while (status != SCI_SUCCESS); | 989 | } while (status != SCI_SUCCESS); |
1001 | 990 | ||
1002 | done: | 991 | done: |
@@ -1008,15 +997,14 @@ static u16 isci_tci_active(struct isci_host *ihost) | |||
1008 | return CIRC_CNT(ihost->tci_head, ihost->tci_tail, SCI_MAX_IO_REQUESTS); | 997 | return CIRC_CNT(ihost->tci_head, ihost->tci_tail, SCI_MAX_IO_REQUESTS); |
1009 | } | 998 | } |
1010 | 999 | ||
1011 | static enum sci_status scic_controller_start(struct scic_sds_controller *scic, | 1000 | static enum sci_status scic_controller_start(struct isci_host *ihost, |
1012 | u32 timeout) | 1001 | u32 timeout) |
1013 | { | 1002 | { |
1014 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1015 | enum sci_status result; | 1003 | enum sci_status result; |
1016 | u16 index; | 1004 | u16 index; |
1017 | 1005 | ||
1018 | if (scic->sm.current_state_id != SCIC_INITIALIZED) { | 1006 | if (ihost->sm.current_state_id != SCIC_INITIALIZED) { |
1019 | dev_warn(scic_to_dev(scic), | 1007 | dev_warn(&ihost->pdev->dev, |
1020 | "SCIC Controller start operation requested in " | 1008 | "SCIC Controller start operation requested in " |
1021 | "invalid state\n"); | 1009 | "invalid state\n"); |
1022 | return SCI_FAILURE_INVALID_STATE; | 1010 | return SCI_FAILURE_INVALID_STATE; |
@@ -1026,34 +1014,34 @@ static enum sci_status scic_controller_start(struct scic_sds_controller *scic, | |||
1026 | BUILD_BUG_ON(SCI_MAX_IO_REQUESTS > 1 << sizeof(ihost->tci_pool[0]) * 8); | 1014 | BUILD_BUG_ON(SCI_MAX_IO_REQUESTS > 1 << sizeof(ihost->tci_pool[0]) * 8); |
1027 | ihost->tci_head = 0; | 1015 | ihost->tci_head = 0; |
1028 | ihost->tci_tail = 0; | 1016 | ihost->tci_tail = 0; |
1029 | for (index = 0; index < scic->task_context_entries; index++) | 1017 | for (index = 0; index < ihost->task_context_entries; index++) |
1030 | isci_tci_free(ihost, index); | 1018 | isci_tci_free(ihost, index); |
1031 | 1019 | ||
1032 | /* Build the RNi free pool */ | 1020 | /* Build the RNi free pool */ |
1033 | scic_sds_remote_node_table_initialize( | 1021 | scic_sds_remote_node_table_initialize( |
1034 | &scic->available_remote_nodes, | 1022 | &ihost->available_remote_nodes, |
1035 | scic->remote_node_entries); | 1023 | ihost->remote_node_entries); |
1036 | 1024 | ||
1037 | /* | 1025 | /* |
1038 | * Before anything else lets make sure we will not be | 1026 | * Before anything else lets make sure we will not be |
1039 | * interrupted by the hardware. | 1027 | * interrupted by the hardware. |
1040 | */ | 1028 | */ |
1041 | scic_controller_disable_interrupts(scic); | 1029 | scic_controller_disable_interrupts(ihost); |
1042 | 1030 | ||
1043 | /* Enable the port task scheduler */ | 1031 | /* Enable the port task scheduler */ |
1044 | scic_sds_controller_enable_port_task_scheduler(scic); | 1032 | scic_sds_controller_enable_port_task_scheduler(ihost); |
1045 | 1033 | ||
1046 | /* Assign all the task entries to scic physical function */ | 1034 | /* Assign all the task entries to ihost physical function */ |
1047 | scic_sds_controller_assign_task_entries(scic); | 1035 | scic_sds_controller_assign_task_entries(ihost); |
1048 | 1036 | ||
1049 | /* Now initialize the completion queue */ | 1037 | /* Now initialize the completion queue */ |
1050 | scic_sds_controller_initialize_completion_queue(scic); | 1038 | scic_sds_controller_initialize_completion_queue(ihost); |
1051 | 1039 | ||
1052 | /* Initialize the unsolicited frame queue for use */ | 1040 | /* Initialize the unsolicited frame queue for use */ |
1053 | scic_sds_controller_initialize_unsolicited_frame_queue(scic); | 1041 | scic_sds_controller_initialize_unsolicited_frame_queue(ihost); |
1054 | 1042 | ||
1055 | /* Start all of the ports on this controller */ | 1043 | /* Start all of the ports on this controller */ |
1056 | for (index = 0; index < scic->logical_port_entries; index++) { | 1044 | for (index = 0; index < ihost->logical_port_entries; index++) { |
1057 | struct isci_port *iport = &ihost->ports[index]; | 1045 | struct isci_port *iport = &ihost->ports[index]; |
1058 | 1046 | ||
1059 | result = scic_sds_port_start(iport); | 1047 | result = scic_sds_port_start(iport); |
@@ -1061,11 +1049,11 @@ static enum sci_status scic_controller_start(struct scic_sds_controller *scic, | |||
1061 | return result; | 1049 | return result; |
1062 | } | 1050 | } |
1063 | 1051 | ||
1064 | scic_sds_controller_start_next_phy(scic); | 1052 | scic_sds_controller_start_next_phy(ihost); |
1065 | 1053 | ||
1066 | sci_mod_timer(&scic->timer, timeout); | 1054 | sci_mod_timer(&ihost->timer, timeout); |
1067 | 1055 | ||
1068 | sci_change_state(&scic->sm, SCIC_STARTING); | 1056 | sci_change_state(&ihost->sm, SCIC_STARTING); |
1069 | 1057 | ||
1070 | return SCI_SUCCESS; | 1058 | return SCI_SUCCESS; |
1071 | } | 1059 | } |
@@ -1073,35 +1061,35 @@ static enum sci_status scic_controller_start(struct scic_sds_controller *scic, | |||
1073 | void isci_host_scan_start(struct Scsi_Host *shost) | 1061 | void isci_host_scan_start(struct Scsi_Host *shost) |
1074 | { | 1062 | { |
1075 | struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha; | 1063 | struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha; |
1076 | unsigned long tmo = scic_controller_get_suggested_start_timeout(&ihost->sci); | 1064 | unsigned long tmo = scic_controller_get_suggested_start_timeout(ihost); |
1077 | 1065 | ||
1078 | set_bit(IHOST_START_PENDING, &ihost->flags); | 1066 | set_bit(IHOST_START_PENDING, &ihost->flags); |
1079 | 1067 | ||
1080 | spin_lock_irq(&ihost->scic_lock); | 1068 | spin_lock_irq(&ihost->scic_lock); |
1081 | scic_controller_start(&ihost->sci, tmo); | 1069 | scic_controller_start(ihost, tmo); |
1082 | scic_controller_enable_interrupts(&ihost->sci); | 1070 | scic_controller_enable_interrupts(ihost); |
1083 | spin_unlock_irq(&ihost->scic_lock); | 1071 | spin_unlock_irq(&ihost->scic_lock); |
1084 | } | 1072 | } |
1085 | 1073 | ||
1086 | static void isci_host_stop_complete(struct isci_host *ihost, enum sci_status completion_status) | 1074 | static void isci_host_stop_complete(struct isci_host *ihost, enum sci_status completion_status) |
1087 | { | 1075 | { |
1088 | isci_host_change_state(ihost, isci_stopped); | 1076 | isci_host_change_state(ihost, isci_stopped); |
1089 | scic_controller_disable_interrupts(&ihost->sci); | 1077 | scic_controller_disable_interrupts(ihost); |
1090 | clear_bit(IHOST_STOP_PENDING, &ihost->flags); | 1078 | clear_bit(IHOST_STOP_PENDING, &ihost->flags); |
1091 | wake_up(&ihost->eventq); | 1079 | wake_up(&ihost->eventq); |
1092 | } | 1080 | } |
1093 | 1081 | ||
1094 | static void scic_sds_controller_completion_handler(struct scic_sds_controller *scic) | 1082 | static void scic_sds_controller_completion_handler(struct isci_host *ihost) |
1095 | { | 1083 | { |
1096 | /* Empty out the completion queue */ | 1084 | /* Empty out the completion queue */ |
1097 | if (scic_sds_controller_completion_queue_has_entries(scic)) | 1085 | if (scic_sds_controller_completion_queue_has_entries(ihost)) |
1098 | scic_sds_controller_process_completions(scic); | 1086 | scic_sds_controller_process_completions(ihost); |
1099 | 1087 | ||
1100 | /* Clear the interrupt and enable all interrupts again */ | 1088 | /* Clear the interrupt and enable all interrupts again */ |
1101 | writel(SMU_ISR_COMPLETION, &scic->smu_registers->interrupt_status); | 1089 | writel(SMU_ISR_COMPLETION, &ihost->smu_registers->interrupt_status); |
1102 | /* Could we write the value of SMU_ISR_COMPLETION? */ | 1090 | /* Could we write the value of SMU_ISR_COMPLETION? */ |
1103 | writel(0xFF000000, &scic->smu_registers->interrupt_mask); | 1091 | writel(0xFF000000, &ihost->smu_registers->interrupt_mask); |
1104 | writel(0, &scic->smu_registers->interrupt_mask); | 1092 | writel(0, &ihost->smu_registers->interrupt_mask); |
1105 | } | 1093 | } |
1106 | 1094 | ||
1107 | /** | 1095 | /** |
@@ -1114,7 +1102,7 @@ static void scic_sds_controller_completion_handler(struct scic_sds_controller *s | |||
1114 | */ | 1102 | */ |
1115 | static void isci_host_completion_routine(unsigned long data) | 1103 | static void isci_host_completion_routine(unsigned long data) |
1116 | { | 1104 | { |
1117 | struct isci_host *isci_host = (struct isci_host *)data; | 1105 | struct isci_host *ihost = (struct isci_host *)data; |
1118 | struct list_head completed_request_list; | 1106 | struct list_head completed_request_list; |
1119 | struct list_head errored_request_list; | 1107 | struct list_head errored_request_list; |
1120 | struct list_head *current_position; | 1108 | struct list_head *current_position; |
@@ -1126,20 +1114,20 @@ static void isci_host_completion_routine(unsigned long data) | |||
1126 | INIT_LIST_HEAD(&completed_request_list); | 1114 | INIT_LIST_HEAD(&completed_request_list); |
1127 | INIT_LIST_HEAD(&errored_request_list); | 1115 | INIT_LIST_HEAD(&errored_request_list); |
1128 | 1116 | ||
1129 | spin_lock_irq(&isci_host->scic_lock); | 1117 | spin_lock_irq(&ihost->scic_lock); |
1130 | 1118 | ||
1131 | scic_sds_controller_completion_handler(&isci_host->sci); | 1119 | scic_sds_controller_completion_handler(ihost); |
1132 | 1120 | ||
1133 | /* Take the lists of completed I/Os from the host. */ | 1121 | /* Take the lists of completed I/Os from the host. */ |
1134 | 1122 | ||
1135 | list_splice_init(&isci_host->requests_to_complete, | 1123 | list_splice_init(&ihost->requests_to_complete, |
1136 | &completed_request_list); | 1124 | &completed_request_list); |
1137 | 1125 | ||
1138 | /* Take the list of errored I/Os from the host. */ | 1126 | /* Take the list of errored I/Os from the host. */ |
1139 | list_splice_init(&isci_host->requests_to_errorback, | 1127 | list_splice_init(&ihost->requests_to_errorback, |
1140 | &errored_request_list); | 1128 | &errored_request_list); |
1141 | 1129 | ||
1142 | spin_unlock_irq(&isci_host->scic_lock); | 1130 | spin_unlock_irq(&ihost->scic_lock); |
1143 | 1131 | ||
1144 | /* Process any completions in the lists. */ | 1132 | /* Process any completions in the lists. */ |
1145 | list_for_each_safe(current_position, next_position, | 1133 | list_for_each_safe(current_position, next_position, |
@@ -1150,7 +1138,7 @@ static void isci_host_completion_routine(unsigned long data) | |||
1150 | task = isci_request_access_task(request); | 1138 | task = isci_request_access_task(request); |
1151 | 1139 | ||
1152 | /* Normal notification (task_done) */ | 1140 | /* Normal notification (task_done) */ |
1153 | dev_dbg(&isci_host->pdev->dev, | 1141 | dev_dbg(&ihost->pdev->dev, |
1154 | "%s: Normal - request/task = %p/%p\n", | 1142 | "%s: Normal - request/task = %p/%p\n", |
1155 | __func__, | 1143 | __func__, |
1156 | request, | 1144 | request, |
@@ -1169,9 +1157,9 @@ static void isci_host_completion_routine(unsigned long data) | |||
1169 | } | 1157 | } |
1170 | } | 1158 | } |
1171 | 1159 | ||
1172 | spin_lock_irq(&isci_host->scic_lock); | 1160 | spin_lock_irq(&ihost->scic_lock); |
1173 | isci_free_tag(isci_host, request->io_tag); | 1161 | isci_free_tag(ihost, request->io_tag); |
1174 | spin_unlock_irq(&isci_host->scic_lock); | 1162 | spin_unlock_irq(&ihost->scic_lock); |
1175 | } | 1163 | } |
1176 | list_for_each_entry_safe(request, next_request, &errored_request_list, | 1164 | list_for_each_entry_safe(request, next_request, &errored_request_list, |
1177 | completed_node) { | 1165 | completed_node) { |
@@ -1179,7 +1167,7 @@ static void isci_host_completion_routine(unsigned long data) | |||
1179 | task = isci_request_access_task(request); | 1167 | task = isci_request_access_task(request); |
1180 | 1168 | ||
1181 | /* Use sas_task_abort */ | 1169 | /* Use sas_task_abort */ |
1182 | dev_warn(&isci_host->pdev->dev, | 1170 | dev_warn(&ihost->pdev->dev, |
1183 | "%s: Error - request/task = %p/%p\n", | 1171 | "%s: Error - request/task = %p/%p\n", |
1184 | __func__, | 1172 | __func__, |
1185 | request, | 1173 | request, |
@@ -1202,13 +1190,13 @@ static void isci_host_completion_routine(unsigned long data) | |||
1202 | * it. | 1190 | * it. |
1203 | */ | 1191 | */ |
1204 | 1192 | ||
1205 | spin_lock_irq(&isci_host->scic_lock); | 1193 | spin_lock_irq(&ihost->scic_lock); |
1206 | /* Remove the request from the remote device's list | 1194 | /* Remove the request from the remote device's list |
1207 | * of pending requests. | 1195 | * of pending requests. |
1208 | */ | 1196 | */ |
1209 | list_del_init(&request->dev_node); | 1197 | list_del_init(&request->dev_node); |
1210 | isci_free_tag(isci_host, request->io_tag); | 1198 | isci_free_tag(ihost, request->io_tag); |
1211 | spin_unlock_irq(&isci_host->scic_lock); | 1199 | spin_unlock_irq(&ihost->scic_lock); |
1212 | } | 1200 | } |
1213 | } | 1201 | } |
1214 | 1202 | ||
@@ -1232,18 +1220,18 @@ static void isci_host_completion_routine(unsigned long data) | |||
1232 | * controller is already in the STOPPED state. SCI_FAILURE_INVALID_STATE if the | 1220 | * controller is already in the STOPPED state. SCI_FAILURE_INVALID_STATE if the |
1233 | * controller is not either in the STARTED or STOPPED states. | 1221 | * controller is not either in the STARTED or STOPPED states. |
1234 | */ | 1222 | */ |
1235 | static enum sci_status scic_controller_stop(struct scic_sds_controller *scic, | 1223 | static enum sci_status scic_controller_stop(struct isci_host *ihost, |
1236 | u32 timeout) | 1224 | u32 timeout) |
1237 | { | 1225 | { |
1238 | if (scic->sm.current_state_id != SCIC_READY) { | 1226 | if (ihost->sm.current_state_id != SCIC_READY) { |
1239 | dev_warn(scic_to_dev(scic), | 1227 | dev_warn(&ihost->pdev->dev, |
1240 | "SCIC Controller stop operation requested in " | 1228 | "SCIC Controller stop operation requested in " |
1241 | "invalid state\n"); | 1229 | "invalid state\n"); |
1242 | return SCI_FAILURE_INVALID_STATE; | 1230 | return SCI_FAILURE_INVALID_STATE; |
1243 | } | 1231 | } |
1244 | 1232 | ||
1245 | sci_mod_timer(&scic->timer, timeout); | 1233 | sci_mod_timer(&ihost->timer, timeout); |
1246 | sci_change_state(&scic->sm, SCIC_STOPPING); | 1234 | sci_change_state(&ihost->sm, SCIC_STOPPING); |
1247 | return SCI_SUCCESS; | 1235 | return SCI_SUCCESS; |
1248 | } | 1236 | } |
1249 | 1237 | ||
@@ -1259,9 +1247,9 @@ static enum sci_status scic_controller_stop(struct scic_sds_controller *scic, | |||
1259 | * SCI_SUCCESS if the reset operation successfully started. SCI_FATAL_ERROR if | 1247 | * SCI_SUCCESS if the reset operation successfully started. SCI_FATAL_ERROR if |
1260 | * the controller reset operation is unable to complete. | 1248 | * the controller reset operation is unable to complete. |
1261 | */ | 1249 | */ |
1262 | static enum sci_status scic_controller_reset(struct scic_sds_controller *scic) | 1250 | static enum sci_status scic_controller_reset(struct isci_host *ihost) |
1263 | { | 1251 | { |
1264 | switch (scic->sm.current_state_id) { | 1252 | switch (ihost->sm.current_state_id) { |
1265 | case SCIC_RESET: | 1253 | case SCIC_RESET: |
1266 | case SCIC_READY: | 1254 | case SCIC_READY: |
1267 | case SCIC_STOPPED: | 1255 | case SCIC_STOPPED: |
@@ -1270,10 +1258,10 @@ static enum sci_status scic_controller_reset(struct scic_sds_controller *scic) | |||
1270 | * The reset operation is not a graceful cleanup, just | 1258 | * The reset operation is not a graceful cleanup, just |
1271 | * perform the state transition. | 1259 | * perform the state transition. |
1272 | */ | 1260 | */ |
1273 | sci_change_state(&scic->sm, SCIC_RESETTING); | 1261 | sci_change_state(&ihost->sm, SCIC_RESETTING); |
1274 | return SCI_SUCCESS; | 1262 | return SCI_SUCCESS; |
1275 | default: | 1263 | default: |
1276 | dev_warn(scic_to_dev(scic), | 1264 | dev_warn(&ihost->pdev->dev, |
1277 | "SCIC Controller reset operation requested in " | 1265 | "SCIC Controller reset operation requested in " |
1278 | "invalid state\n"); | 1266 | "invalid state\n"); |
1279 | return SCI_FAILURE_INVALID_STATE; | 1267 | return SCI_FAILURE_INVALID_STATE; |
@@ -1298,14 +1286,14 @@ void isci_host_deinit(struct isci_host *ihost) | |||
1298 | set_bit(IHOST_STOP_PENDING, &ihost->flags); | 1286 | set_bit(IHOST_STOP_PENDING, &ihost->flags); |
1299 | 1287 | ||
1300 | spin_lock_irq(&ihost->scic_lock); | 1288 | spin_lock_irq(&ihost->scic_lock); |
1301 | scic_controller_stop(&ihost->sci, SCIC_CONTROLLER_STOP_TIMEOUT); | 1289 | scic_controller_stop(ihost, SCIC_CONTROLLER_STOP_TIMEOUT); |
1302 | spin_unlock_irq(&ihost->scic_lock); | 1290 | spin_unlock_irq(&ihost->scic_lock); |
1303 | 1291 | ||
1304 | wait_for_stop(ihost); | 1292 | wait_for_stop(ihost); |
1305 | scic_controller_reset(&ihost->sci); | 1293 | scic_controller_reset(ihost); |
1306 | 1294 | ||
1307 | /* Cancel any/all outstanding port timers */ | 1295 | /* Cancel any/all outstanding port timers */ |
1308 | for (i = 0; i < ihost->sci.logical_port_entries; i++) { | 1296 | for (i = 0; i < ihost->logical_port_entries; i++) { |
1309 | struct isci_port *iport = &ihost->ports[i]; | 1297 | struct isci_port *iport = &ihost->ports[i]; |
1310 | del_timer_sync(&iport->timer.timer); | 1298 | del_timer_sync(&iport->timer.timer); |
1311 | } | 1299 | } |
@@ -1316,13 +1304,13 @@ void isci_host_deinit(struct isci_host *ihost) | |||
1316 | del_timer_sync(&iphy->sata_timer.timer); | 1304 | del_timer_sync(&iphy->sata_timer.timer); |
1317 | } | 1305 | } |
1318 | 1306 | ||
1319 | del_timer_sync(&ihost->sci.port_agent.timer.timer); | 1307 | del_timer_sync(&ihost->port_agent.timer.timer); |
1320 | 1308 | ||
1321 | del_timer_sync(&ihost->sci.power_control.timer.timer); | 1309 | del_timer_sync(&ihost->power_control.timer.timer); |
1322 | 1310 | ||
1323 | del_timer_sync(&ihost->sci.timer.timer); | 1311 | del_timer_sync(&ihost->timer.timer); |
1324 | 1312 | ||
1325 | del_timer_sync(&ihost->sci.phy_timer.timer); | 1313 | del_timer_sync(&ihost->phy_timer.timer); |
1326 | } | 1314 | } |
1327 | 1315 | ||
1328 | static void __iomem *scu_base(struct isci_host *isci_host) | 1316 | static void __iomem *scu_base(struct isci_host *isci_host) |
@@ -1369,16 +1357,16 @@ static void isci_user_parameters_get( | |||
1369 | 1357 | ||
1370 | static void scic_sds_controller_initial_state_enter(struct sci_base_state_machine *sm) | 1358 | static void scic_sds_controller_initial_state_enter(struct sci_base_state_machine *sm) |
1371 | { | 1359 | { |
1372 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1360 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1373 | 1361 | ||
1374 | sci_change_state(&scic->sm, SCIC_RESET); | 1362 | sci_change_state(&ihost->sm, SCIC_RESET); |
1375 | } | 1363 | } |
1376 | 1364 | ||
1377 | static inline void scic_sds_controller_starting_state_exit(struct sci_base_state_machine *sm) | 1365 | static inline void scic_sds_controller_starting_state_exit(struct sci_base_state_machine *sm) |
1378 | { | 1366 | { |
1379 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1367 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1380 | 1368 | ||
1381 | sci_del_timer(&scic->timer); | 1369 | sci_del_timer(&ihost->timer); |
1382 | } | 1370 | } |
1383 | 1371 | ||
1384 | #define INTERRUPT_COALESCE_TIMEOUT_BASE_RANGE_LOWER_BOUND_NS 853 | 1372 | #define INTERRUPT_COALESCE_TIMEOUT_BASE_RANGE_LOWER_BOUND_NS 853 |
@@ -1405,10 +1393,10 @@ static inline void scic_sds_controller_starting_state_exit(struct sci_base_state | |||
1405 | * SCI_SUCCESS The user successfully updated the interrutp coalescence. | 1393 | * SCI_SUCCESS The user successfully updated the interrutp coalescence. |
1406 | * SCI_FAILURE_INVALID_PARAMETER_VALUE The user input value is out of range. | 1394 | * SCI_FAILURE_INVALID_PARAMETER_VALUE The user input value is out of range. |
1407 | */ | 1395 | */ |
1408 | static enum sci_status scic_controller_set_interrupt_coalescence( | 1396 | static enum sci_status |
1409 | struct scic_sds_controller *scic_controller, | 1397 | scic_controller_set_interrupt_coalescence(struct isci_host *ihost, |
1410 | u32 coalesce_number, | 1398 | u32 coalesce_number, |
1411 | u32 coalesce_timeout) | 1399 | u32 coalesce_timeout) |
1412 | { | 1400 | { |
1413 | u8 timeout_encode = 0; | 1401 | u8 timeout_encode = 0; |
1414 | u32 min = 0; | 1402 | u32 min = 0; |
@@ -1491,11 +1479,11 @@ static enum sci_status scic_controller_set_interrupt_coalescence( | |||
1491 | 1479 | ||
1492 | writel(SMU_ICC_GEN_VAL(NUMBER, coalesce_number) | | 1480 | writel(SMU_ICC_GEN_VAL(NUMBER, coalesce_number) | |
1493 | SMU_ICC_GEN_VAL(TIMER, timeout_encode), | 1481 | SMU_ICC_GEN_VAL(TIMER, timeout_encode), |
1494 | &scic_controller->smu_registers->interrupt_coalesce_control); | 1482 | &ihost->smu_registers->interrupt_coalesce_control); |
1495 | 1483 | ||
1496 | 1484 | ||
1497 | scic_controller->interrupt_coalesce_number = (u16)coalesce_number; | 1485 | ihost->interrupt_coalesce_number = (u16)coalesce_number; |
1498 | scic_controller->interrupt_coalesce_timeout = coalesce_timeout / 100; | 1486 | ihost->interrupt_coalesce_timeout = coalesce_timeout / 100; |
1499 | 1487 | ||
1500 | return SCI_SUCCESS; | 1488 | return SCI_SUCCESS; |
1501 | } | 1489 | } |
@@ -1503,26 +1491,25 @@ static enum sci_status scic_controller_set_interrupt_coalescence( | |||
1503 | 1491 | ||
1504 | static void scic_sds_controller_ready_state_enter(struct sci_base_state_machine *sm) | 1492 | static void scic_sds_controller_ready_state_enter(struct sci_base_state_machine *sm) |
1505 | { | 1493 | { |
1506 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1494 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1507 | 1495 | ||
1508 | /* set the default interrupt coalescence number and timeout value. */ | 1496 | /* set the default interrupt coalescence number and timeout value. */ |
1509 | scic_controller_set_interrupt_coalescence(scic, 0x10, 250); | 1497 | scic_controller_set_interrupt_coalescence(ihost, 0x10, 250); |
1510 | } | 1498 | } |
1511 | 1499 | ||
1512 | static void scic_sds_controller_ready_state_exit(struct sci_base_state_machine *sm) | 1500 | static void scic_sds_controller_ready_state_exit(struct sci_base_state_machine *sm) |
1513 | { | 1501 | { |
1514 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1502 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1515 | 1503 | ||
1516 | /* disable interrupt coalescence. */ | 1504 | /* disable interrupt coalescence. */ |
1517 | scic_controller_set_interrupt_coalescence(scic, 0, 0); | 1505 | scic_controller_set_interrupt_coalescence(ihost, 0, 0); |
1518 | } | 1506 | } |
1519 | 1507 | ||
1520 | static enum sci_status scic_sds_controller_stop_phys(struct scic_sds_controller *scic) | 1508 | static enum sci_status scic_sds_controller_stop_phys(struct isci_host *ihost) |
1521 | { | 1509 | { |
1522 | u32 index; | 1510 | u32 index; |
1523 | enum sci_status status; | 1511 | enum sci_status status; |
1524 | enum sci_status phy_status; | 1512 | enum sci_status phy_status; |
1525 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1526 | 1513 | ||
1527 | status = SCI_SUCCESS; | 1514 | status = SCI_SUCCESS; |
1528 | 1515 | ||
@@ -1533,7 +1520,7 @@ static enum sci_status scic_sds_controller_stop_phys(struct scic_sds_controller | |||
1533 | phy_status != SCI_FAILURE_INVALID_STATE) { | 1520 | phy_status != SCI_FAILURE_INVALID_STATE) { |
1534 | status = SCI_FAILURE; | 1521 | status = SCI_FAILURE; |
1535 | 1522 | ||
1536 | dev_warn(scic_to_dev(scic), | 1523 | dev_warn(&ihost->pdev->dev, |
1537 | "%s: Controller stop operation failed to stop " | 1524 | "%s: Controller stop operation failed to stop " |
1538 | "phy %d because of status %d.\n", | 1525 | "phy %d because of status %d.\n", |
1539 | __func__, | 1526 | __func__, |
@@ -1544,14 +1531,13 @@ static enum sci_status scic_sds_controller_stop_phys(struct scic_sds_controller | |||
1544 | return status; | 1531 | return status; |
1545 | } | 1532 | } |
1546 | 1533 | ||
1547 | static enum sci_status scic_sds_controller_stop_ports(struct scic_sds_controller *scic) | 1534 | static enum sci_status scic_sds_controller_stop_ports(struct isci_host *ihost) |
1548 | { | 1535 | { |
1549 | u32 index; | 1536 | u32 index; |
1550 | enum sci_status port_status; | 1537 | enum sci_status port_status; |
1551 | enum sci_status status = SCI_SUCCESS; | 1538 | enum sci_status status = SCI_SUCCESS; |
1552 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1553 | 1539 | ||
1554 | for (index = 0; index < scic->logical_port_entries; index++) { | 1540 | for (index = 0; index < ihost->logical_port_entries; index++) { |
1555 | struct isci_port *iport = &ihost->ports[index]; | 1541 | struct isci_port *iport = &ihost->ports[index]; |
1556 | 1542 | ||
1557 | port_status = scic_sds_port_stop(iport); | 1543 | port_status = scic_sds_port_stop(iport); |
@@ -1560,7 +1546,7 @@ static enum sci_status scic_sds_controller_stop_ports(struct scic_sds_controller | |||
1560 | (port_status != SCI_FAILURE_INVALID_STATE)) { | 1546 | (port_status != SCI_FAILURE_INVALID_STATE)) { |
1561 | status = SCI_FAILURE; | 1547 | status = SCI_FAILURE; |
1562 | 1548 | ||
1563 | dev_warn(scic_to_dev(scic), | 1549 | dev_warn(&ihost->pdev->dev, |
1564 | "%s: Controller stop operation failed to " | 1550 | "%s: Controller stop operation failed to " |
1565 | "stop port %d because of status %d.\n", | 1551 | "stop port %d because of status %d.\n", |
1566 | __func__, | 1552 | __func__, |
@@ -1572,7 +1558,7 @@ static enum sci_status scic_sds_controller_stop_ports(struct scic_sds_controller | |||
1572 | return status; | 1558 | return status; |
1573 | } | 1559 | } |
1574 | 1560 | ||
1575 | static enum sci_status scic_sds_controller_stop_devices(struct scic_sds_controller *scic) | 1561 | static enum sci_status scic_sds_controller_stop_devices(struct isci_host *ihost) |
1576 | { | 1562 | { |
1577 | u32 index; | 1563 | u32 index; |
1578 | enum sci_status status; | 1564 | enum sci_status status; |
@@ -1580,19 +1566,19 @@ static enum sci_status scic_sds_controller_stop_devices(struct scic_sds_controll | |||
1580 | 1566 | ||
1581 | status = SCI_SUCCESS; | 1567 | status = SCI_SUCCESS; |
1582 | 1568 | ||
1583 | for (index = 0; index < scic->remote_node_entries; index++) { | 1569 | for (index = 0; index < ihost->remote_node_entries; index++) { |
1584 | if (scic->device_table[index] != NULL) { | 1570 | if (ihost->device_table[index] != NULL) { |
1585 | /* / @todo What timeout value do we want to provide to this request? */ | 1571 | /* / @todo What timeout value do we want to provide to this request? */ |
1586 | device_status = scic_remote_device_stop(scic->device_table[index], 0); | 1572 | device_status = scic_remote_device_stop(ihost->device_table[index], 0); |
1587 | 1573 | ||
1588 | if ((device_status != SCI_SUCCESS) && | 1574 | if ((device_status != SCI_SUCCESS) && |
1589 | (device_status != SCI_FAILURE_INVALID_STATE)) { | 1575 | (device_status != SCI_FAILURE_INVALID_STATE)) { |
1590 | dev_warn(scic_to_dev(scic), | 1576 | dev_warn(&ihost->pdev->dev, |
1591 | "%s: Controller stop operation failed " | 1577 | "%s: Controller stop operation failed " |
1592 | "to stop device 0x%p because of " | 1578 | "to stop device 0x%p because of " |
1593 | "status %d.\n", | 1579 | "status %d.\n", |
1594 | __func__, | 1580 | __func__, |
1595 | scic->device_table[index], device_status); | 1581 | ihost->device_table[index], device_status); |
1596 | } | 1582 | } |
1597 | } | 1583 | } |
1598 | } | 1584 | } |
@@ -1602,19 +1588,19 @@ static enum sci_status scic_sds_controller_stop_devices(struct scic_sds_controll | |||
1602 | 1588 | ||
1603 | static void scic_sds_controller_stopping_state_enter(struct sci_base_state_machine *sm) | 1589 | static void scic_sds_controller_stopping_state_enter(struct sci_base_state_machine *sm) |
1604 | { | 1590 | { |
1605 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1591 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1606 | 1592 | ||
1607 | /* Stop all of the components for this controller */ | 1593 | /* Stop all of the components for this controller */ |
1608 | scic_sds_controller_stop_phys(scic); | 1594 | scic_sds_controller_stop_phys(ihost); |
1609 | scic_sds_controller_stop_ports(scic); | 1595 | scic_sds_controller_stop_ports(ihost); |
1610 | scic_sds_controller_stop_devices(scic); | 1596 | scic_sds_controller_stop_devices(ihost); |
1611 | } | 1597 | } |
1612 | 1598 | ||
1613 | static void scic_sds_controller_stopping_state_exit(struct sci_base_state_machine *sm) | 1599 | static void scic_sds_controller_stopping_state_exit(struct sci_base_state_machine *sm) |
1614 | { | 1600 | { |
1615 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1601 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1616 | 1602 | ||
1617 | sci_del_timer(&scic->timer); | 1603 | sci_del_timer(&ihost->timer); |
1618 | } | 1604 | } |
1619 | 1605 | ||
1620 | 1606 | ||
@@ -1623,30 +1609,30 @@ static void scic_sds_controller_stopping_state_exit(struct sci_base_state_machin | |||
1623 | * | 1609 | * |
1624 | * This method will reset the controller hardware. | 1610 | * This method will reset the controller hardware. |
1625 | */ | 1611 | */ |
1626 | static void scic_sds_controller_reset_hardware(struct scic_sds_controller *scic) | 1612 | static void scic_sds_controller_reset_hardware(struct isci_host *ihost) |
1627 | { | 1613 | { |
1628 | /* Disable interrupts so we dont take any spurious interrupts */ | 1614 | /* Disable interrupts so we dont take any spurious interrupts */ |
1629 | scic_controller_disable_interrupts(scic); | 1615 | scic_controller_disable_interrupts(ihost); |
1630 | 1616 | ||
1631 | /* Reset the SCU */ | 1617 | /* Reset the SCU */ |
1632 | writel(0xFFFFFFFF, &scic->smu_registers->soft_reset_control); | 1618 | writel(0xFFFFFFFF, &ihost->smu_registers->soft_reset_control); |
1633 | 1619 | ||
1634 | /* Delay for 1ms to before clearing the CQP and UFQPR. */ | 1620 | /* Delay for 1ms to before clearing the CQP and UFQPR. */ |
1635 | udelay(1000); | 1621 | udelay(1000); |
1636 | 1622 | ||
1637 | /* The write to the CQGR clears the CQP */ | 1623 | /* The write to the CQGR clears the CQP */ |
1638 | writel(0x00000000, &scic->smu_registers->completion_queue_get); | 1624 | writel(0x00000000, &ihost->smu_registers->completion_queue_get); |
1639 | 1625 | ||
1640 | /* The write to the UFQGP clears the UFQPR */ | 1626 | /* The write to the UFQGP clears the UFQPR */ |
1641 | writel(0, &scic->scu_registers->sdma.unsolicited_frame_get_pointer); | 1627 | writel(0, &ihost->scu_registers->sdma.unsolicited_frame_get_pointer); |
1642 | } | 1628 | } |
1643 | 1629 | ||
1644 | static void scic_sds_controller_resetting_state_enter(struct sci_base_state_machine *sm) | 1630 | static void scic_sds_controller_resetting_state_enter(struct sci_base_state_machine *sm) |
1645 | { | 1631 | { |
1646 | struct scic_sds_controller *scic = container_of(sm, typeof(*scic), sm); | 1632 | struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); |
1647 | 1633 | ||
1648 | scic_sds_controller_reset_hardware(scic); | 1634 | scic_sds_controller_reset_hardware(ihost); |
1649 | sci_change_state(&scic->sm, SCIC_RESET); | 1635 | sci_change_state(&ihost->sm, SCIC_RESET); |
1650 | } | 1636 | } |
1651 | 1637 | ||
1652 | static const struct sci_base_state scic_sds_controller_state_table[] = { | 1638 | static const struct sci_base_state scic_sds_controller_state_table[] = { |
@@ -1674,58 +1660,56 @@ static const struct sci_base_state scic_sds_controller_state_table[] = { | |||
1674 | [SCIC_FAILED] = {} | 1660 | [SCIC_FAILED] = {} |
1675 | }; | 1661 | }; |
1676 | 1662 | ||
1677 | static void scic_sds_controller_set_default_config_parameters(struct scic_sds_controller *scic) | 1663 | static void scic_sds_controller_set_default_config_parameters(struct isci_host *ihost) |
1678 | { | 1664 | { |
1679 | /* these defaults are overridden by the platform / firmware */ | 1665 | /* these defaults are overridden by the platform / firmware */ |
1680 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1681 | u16 index; | 1666 | u16 index; |
1682 | 1667 | ||
1683 | /* Default to APC mode. */ | 1668 | /* Default to APC mode. */ |
1684 | scic->oem_parameters.sds1.controller.mode_type = SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE; | 1669 | ihost->oem_parameters.sds1.controller.mode_type = SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE; |
1685 | 1670 | ||
1686 | /* Default to APC mode. */ | 1671 | /* Default to APC mode. */ |
1687 | scic->oem_parameters.sds1.controller.max_concurrent_dev_spin_up = 1; | 1672 | ihost->oem_parameters.sds1.controller.max_concurrent_dev_spin_up = 1; |
1688 | 1673 | ||
1689 | /* Default to no SSC operation. */ | 1674 | /* Default to no SSC operation. */ |
1690 | scic->oem_parameters.sds1.controller.do_enable_ssc = false; | 1675 | ihost->oem_parameters.sds1.controller.do_enable_ssc = false; |
1691 | 1676 | ||
1692 | /* Initialize all of the port parameter information to narrow ports. */ | 1677 | /* Initialize all of the port parameter information to narrow ports. */ |
1693 | for (index = 0; index < SCI_MAX_PORTS; index++) { | 1678 | for (index = 0; index < SCI_MAX_PORTS; index++) { |
1694 | scic->oem_parameters.sds1.ports[index].phy_mask = 0; | 1679 | ihost->oem_parameters.sds1.ports[index].phy_mask = 0; |
1695 | } | 1680 | } |
1696 | 1681 | ||
1697 | /* Initialize all of the phy parameter information. */ | 1682 | /* Initialize all of the phy parameter information. */ |
1698 | for (index = 0; index < SCI_MAX_PHYS; index++) { | 1683 | for (index = 0; index < SCI_MAX_PHYS; index++) { |
1699 | /* Default to 6G (i.e. Gen 3) for now. */ | 1684 | /* Default to 6G (i.e. Gen 3) for now. */ |
1700 | scic->user_parameters.sds1.phys[index].max_speed_generation = 3; | 1685 | ihost->user_parameters.sds1.phys[index].max_speed_generation = 3; |
1701 | 1686 | ||
1702 | /* the frequencies cannot be 0 */ | 1687 | /* the frequencies cannot be 0 */ |
1703 | scic->user_parameters.sds1.phys[index].align_insertion_frequency = 0x7f; | 1688 | ihost->user_parameters.sds1.phys[index].align_insertion_frequency = 0x7f; |
1704 | scic->user_parameters.sds1.phys[index].in_connection_align_insertion_frequency = 0xff; | 1689 | ihost->user_parameters.sds1.phys[index].in_connection_align_insertion_frequency = 0xff; |
1705 | scic->user_parameters.sds1.phys[index].notify_enable_spin_up_insertion_frequency = 0x33; | 1690 | ihost->user_parameters.sds1.phys[index].notify_enable_spin_up_insertion_frequency = 0x33; |
1706 | 1691 | ||
1707 | /* | 1692 | /* |
1708 | * Previous Vitesse based expanders had a arbitration issue that | 1693 | * Previous Vitesse based expanders had a arbitration issue that |
1709 | * is worked around by having the upper 32-bits of SAS address | 1694 | * is worked around by having the upper 32-bits of SAS address |
1710 | * with a value greater then the Vitesse company identifier. | 1695 | * with a value greater then the Vitesse company identifier. |
1711 | * Hence, usage of 0x5FCFFFFF. */ | 1696 | * Hence, usage of 0x5FCFFFFF. */ |
1712 | scic->oem_parameters.sds1.phys[index].sas_address.low = 0x1 + ihost->id; | 1697 | ihost->oem_parameters.sds1.phys[index].sas_address.low = 0x1 + ihost->id; |
1713 | scic->oem_parameters.sds1.phys[index].sas_address.high = 0x5FCFFFFF; | 1698 | ihost->oem_parameters.sds1.phys[index].sas_address.high = 0x5FCFFFFF; |
1714 | } | 1699 | } |
1715 | 1700 | ||
1716 | scic->user_parameters.sds1.stp_inactivity_timeout = 5; | 1701 | ihost->user_parameters.sds1.stp_inactivity_timeout = 5; |
1717 | scic->user_parameters.sds1.ssp_inactivity_timeout = 5; | 1702 | ihost->user_parameters.sds1.ssp_inactivity_timeout = 5; |
1718 | scic->user_parameters.sds1.stp_max_occupancy_timeout = 5; | 1703 | ihost->user_parameters.sds1.stp_max_occupancy_timeout = 5; |
1719 | scic->user_parameters.sds1.ssp_max_occupancy_timeout = 20; | 1704 | ihost->user_parameters.sds1.ssp_max_occupancy_timeout = 20; |
1720 | scic->user_parameters.sds1.no_outbound_task_timeout = 20; | 1705 | ihost->user_parameters.sds1.no_outbound_task_timeout = 20; |
1721 | } | 1706 | } |
1722 | 1707 | ||
1723 | static void controller_timeout(unsigned long data) | 1708 | static void controller_timeout(unsigned long data) |
1724 | { | 1709 | { |
1725 | struct sci_timer *tmr = (struct sci_timer *)data; | 1710 | struct sci_timer *tmr = (struct sci_timer *)data; |
1726 | struct scic_sds_controller *scic = container_of(tmr, typeof(*scic), timer); | 1711 | struct isci_host *ihost = container_of(tmr, typeof(*ihost), timer); |
1727 | struct isci_host *ihost = scic_to_ihost(scic); | 1712 | struct sci_base_state_machine *sm = &ihost->sm; |
1728 | struct sci_base_state_machine *sm = &scic->sm; | ||
1729 | unsigned long flags; | 1713 | unsigned long flags; |
1730 | 1714 | ||
1731 | spin_lock_irqsave(&ihost->scic_lock, flags); | 1715 | spin_lock_irqsave(&ihost->scic_lock, flags); |
@@ -1734,12 +1718,12 @@ static void controller_timeout(unsigned long data) | |||
1734 | goto done; | 1718 | goto done; |
1735 | 1719 | ||
1736 | if (sm->current_state_id == SCIC_STARTING) | 1720 | if (sm->current_state_id == SCIC_STARTING) |
1737 | scic_sds_controller_transition_to_ready(scic, SCI_FAILURE_TIMEOUT); | 1721 | scic_sds_controller_transition_to_ready(ihost, SCI_FAILURE_TIMEOUT); |
1738 | else if (sm->current_state_id == SCIC_STOPPING) { | 1722 | else if (sm->current_state_id == SCIC_STOPPING) { |
1739 | sci_change_state(sm, SCIC_FAILED); | 1723 | sci_change_state(sm, SCIC_FAILED); |
1740 | isci_host_stop_complete(ihost, SCI_FAILURE_TIMEOUT); | 1724 | isci_host_stop_complete(ihost, SCI_FAILURE_TIMEOUT); |
1741 | } else /* / @todo Now what do we want to do in this case? */ | 1725 | } else /* / @todo Now what do we want to do in this case? */ |
1742 | dev_err(scic_to_dev(scic), | 1726 | dev_err(&ihost->pdev->dev, |
1743 | "%s: Controller timer fired when controller was not " | 1727 | "%s: Controller timer fired when controller was not " |
1744 | "in a state being timed.\n", | 1728 | "in a state being timed.\n", |
1745 | __func__); | 1729 | __func__); |
@@ -1764,24 +1748,23 @@ done: | |||
1764 | * SCI_FAILURE_UNSUPPORTED_INIT_DATA_VERSION This value is returned if the | 1748 | * SCI_FAILURE_UNSUPPORTED_INIT_DATA_VERSION This value is returned if the |
1765 | * controller does not support the supplied initialization data version. | 1749 | * controller does not support the supplied initialization data version. |
1766 | */ | 1750 | */ |
1767 | static enum sci_status scic_controller_construct(struct scic_sds_controller *scic, | 1751 | static enum sci_status scic_controller_construct(struct isci_host *ihost, |
1768 | void __iomem *scu_base, | 1752 | void __iomem *scu_base, |
1769 | void __iomem *smu_base) | 1753 | void __iomem *smu_base) |
1770 | { | 1754 | { |
1771 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1772 | u8 i; | 1755 | u8 i; |
1773 | 1756 | ||
1774 | sci_init_sm(&scic->sm, scic_sds_controller_state_table, SCIC_INITIAL); | 1757 | sci_init_sm(&ihost->sm, scic_sds_controller_state_table, SCIC_INITIAL); |
1775 | 1758 | ||
1776 | scic->scu_registers = scu_base; | 1759 | ihost->scu_registers = scu_base; |
1777 | scic->smu_registers = smu_base; | 1760 | ihost->smu_registers = smu_base; |
1778 | 1761 | ||
1779 | scic_sds_port_configuration_agent_construct(&scic->port_agent); | 1762 | scic_sds_port_configuration_agent_construct(&ihost->port_agent); |
1780 | 1763 | ||
1781 | /* Construct the ports for this controller */ | 1764 | /* Construct the ports for this controller */ |
1782 | for (i = 0; i < SCI_MAX_PORTS; i++) | 1765 | for (i = 0; i < SCI_MAX_PORTS; i++) |
1783 | scic_sds_port_construct(&ihost->ports[i], i, scic); | 1766 | scic_sds_port_construct(&ihost->ports[i], i, ihost); |
1784 | scic_sds_port_construct(&ihost->ports[i], SCIC_SDS_DUMMY_PORT, scic); | 1767 | scic_sds_port_construct(&ihost->ports[i], SCIC_SDS_DUMMY_PORT, ihost); |
1785 | 1768 | ||
1786 | /* Construct the phys for this controller */ | 1769 | /* Construct the phys for this controller */ |
1787 | for (i = 0; i < SCI_MAX_PHYS; i++) { | 1770 | for (i = 0; i < SCI_MAX_PHYS; i++) { |
@@ -1790,14 +1773,14 @@ static enum sci_status scic_controller_construct(struct scic_sds_controller *sci | |||
1790 | &ihost->ports[SCI_MAX_PORTS], i); | 1773 | &ihost->ports[SCI_MAX_PORTS], i); |
1791 | } | 1774 | } |
1792 | 1775 | ||
1793 | scic->invalid_phy_mask = 0; | 1776 | ihost->invalid_phy_mask = 0; |
1794 | 1777 | ||
1795 | sci_init_timer(&scic->timer, controller_timeout); | 1778 | sci_init_timer(&ihost->timer, controller_timeout); |
1796 | 1779 | ||
1797 | /* Initialize the User and OEM parameters to default values. */ | 1780 | /* Initialize the User and OEM parameters to default values. */ |
1798 | scic_sds_controller_set_default_config_parameters(scic); | 1781 | scic_sds_controller_set_default_config_parameters(ihost); |
1799 | 1782 | ||
1800 | return scic_controller_reset(scic); | 1783 | return scic_controller_reset(ihost); |
1801 | } | 1784 | } |
1802 | 1785 | ||
1803 | int scic_oem_parameters_validate(struct scic_sds_oem_params *oem) | 1786 | int scic_oem_parameters_validate(struct scic_sds_oem_params *oem) |
@@ -1834,10 +1817,10 @@ int scic_oem_parameters_validate(struct scic_sds_oem_params *oem) | |||
1834 | return 0; | 1817 | return 0; |
1835 | } | 1818 | } |
1836 | 1819 | ||
1837 | static enum sci_status scic_oem_parameters_set(struct scic_sds_controller *scic, | 1820 | static enum sci_status scic_oem_parameters_set(struct isci_host *ihost, |
1838 | union scic_oem_parameters *scic_parms) | 1821 | union scic_oem_parameters *scic_parms) |
1839 | { | 1822 | { |
1840 | u32 state = scic->sm.current_state_id; | 1823 | u32 state = ihost->sm.current_state_id; |
1841 | 1824 | ||
1842 | if (state == SCIC_RESET || | 1825 | if (state == SCIC_RESET || |
1843 | state == SCIC_INITIALIZING || | 1826 | state == SCIC_INITIALIZING || |
@@ -1845,7 +1828,7 @@ static enum sci_status scic_oem_parameters_set(struct scic_sds_controller *scic, | |||
1845 | 1828 | ||
1846 | if (scic_oem_parameters_validate(&scic_parms->sds1)) | 1829 | if (scic_oem_parameters_validate(&scic_parms->sds1)) |
1847 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 1830 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
1848 | scic->oem_parameters.sds1 = scic_parms->sds1; | 1831 | ihost->oem_parameters.sds1 = scic_parms->sds1; |
1849 | 1832 | ||
1850 | return SCI_SUCCESS; | 1833 | return SCI_SUCCESS; |
1851 | } | 1834 | } |
@@ -1854,17 +1837,16 @@ static enum sci_status scic_oem_parameters_set(struct scic_sds_controller *scic, | |||
1854 | } | 1837 | } |
1855 | 1838 | ||
1856 | void scic_oem_parameters_get( | 1839 | void scic_oem_parameters_get( |
1857 | struct scic_sds_controller *scic, | 1840 | struct isci_host *ihost, |
1858 | union scic_oem_parameters *scic_parms) | 1841 | union scic_oem_parameters *scic_parms) |
1859 | { | 1842 | { |
1860 | memcpy(scic_parms, (&scic->oem_parameters), sizeof(*scic_parms)); | 1843 | memcpy(scic_parms, (&ihost->oem_parameters), sizeof(*scic_parms)); |
1861 | } | 1844 | } |
1862 | 1845 | ||
1863 | static void power_control_timeout(unsigned long data) | 1846 | static void power_control_timeout(unsigned long data) |
1864 | { | 1847 | { |
1865 | struct sci_timer *tmr = (struct sci_timer *)data; | 1848 | struct sci_timer *tmr = (struct sci_timer *)data; |
1866 | struct scic_sds_controller *scic = container_of(tmr, typeof(*scic), power_control.timer); | 1849 | struct isci_host *ihost = container_of(tmr, typeof(*ihost), power_control.timer); |
1867 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1868 | struct isci_phy *iphy; | 1850 | struct isci_phy *iphy; |
1869 | unsigned long flags; | 1851 | unsigned long flags; |
1870 | u8 i; | 1852 | u8 i; |
@@ -1874,29 +1856,29 @@ static void power_control_timeout(unsigned long data) | |||
1874 | if (tmr->cancel) | 1856 | if (tmr->cancel) |
1875 | goto done; | 1857 | goto done; |
1876 | 1858 | ||
1877 | scic->power_control.phys_granted_power = 0; | 1859 | ihost->power_control.phys_granted_power = 0; |
1878 | 1860 | ||
1879 | if (scic->power_control.phys_waiting == 0) { | 1861 | if (ihost->power_control.phys_waiting == 0) { |
1880 | scic->power_control.timer_started = false; | 1862 | ihost->power_control.timer_started = false; |
1881 | goto done; | 1863 | goto done; |
1882 | } | 1864 | } |
1883 | 1865 | ||
1884 | for (i = 0; i < SCI_MAX_PHYS; i++) { | 1866 | for (i = 0; i < SCI_MAX_PHYS; i++) { |
1885 | 1867 | ||
1886 | if (scic->power_control.phys_waiting == 0) | 1868 | if (ihost->power_control.phys_waiting == 0) |
1887 | break; | 1869 | break; |
1888 | 1870 | ||
1889 | iphy = scic->power_control.requesters[i]; | 1871 | iphy = ihost->power_control.requesters[i]; |
1890 | if (iphy == NULL) | 1872 | if (iphy == NULL) |
1891 | continue; | 1873 | continue; |
1892 | 1874 | ||
1893 | if (scic->power_control.phys_granted_power >= | 1875 | if (ihost->power_control.phys_granted_power >= |
1894 | scic->oem_parameters.sds1.controller.max_concurrent_dev_spin_up) | 1876 | ihost->oem_parameters.sds1.controller.max_concurrent_dev_spin_up) |
1895 | break; | 1877 | break; |
1896 | 1878 | ||
1897 | scic->power_control.requesters[i] = NULL; | 1879 | ihost->power_control.requesters[i] = NULL; |
1898 | scic->power_control.phys_waiting--; | 1880 | ihost->power_control.phys_waiting--; |
1899 | scic->power_control.phys_granted_power++; | 1881 | ihost->power_control.phys_granted_power++; |
1900 | scic_sds_phy_consume_power_handler(iphy); | 1882 | scic_sds_phy_consume_power_handler(iphy); |
1901 | } | 1883 | } |
1902 | 1884 | ||
@@ -1905,7 +1887,7 @@ static void power_control_timeout(unsigned long data) | |||
1905 | * timer in case another phy becomes ready. | 1887 | * timer in case another phy becomes ready. |
1906 | */ | 1888 | */ |
1907 | sci_mod_timer(tmr, SCIC_SDS_CONTROLLER_POWER_CONTROL_INTERVAL); | 1889 | sci_mod_timer(tmr, SCIC_SDS_CONTROLLER_POWER_CONTROL_INTERVAL); |
1908 | scic->power_control.timer_started = true; | 1890 | ihost->power_control.timer_started = true; |
1909 | 1891 | ||
1910 | done: | 1892 | done: |
1911 | spin_unlock_irqrestore(&ihost->scic_lock, flags); | 1893 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
@@ -1918,31 +1900,31 @@ done: | |||
1918 | * | 1900 | * |
1919 | */ | 1901 | */ |
1920 | void scic_sds_controller_power_control_queue_insert( | 1902 | void scic_sds_controller_power_control_queue_insert( |
1921 | struct scic_sds_controller *scic, | 1903 | struct isci_host *ihost, |
1922 | struct isci_phy *iphy) | 1904 | struct isci_phy *iphy) |
1923 | { | 1905 | { |
1924 | BUG_ON(iphy == NULL); | 1906 | BUG_ON(iphy == NULL); |
1925 | 1907 | ||
1926 | if (scic->power_control.phys_granted_power < | 1908 | if (ihost->power_control.phys_granted_power < |
1927 | scic->oem_parameters.sds1.controller.max_concurrent_dev_spin_up) { | 1909 | ihost->oem_parameters.sds1.controller.max_concurrent_dev_spin_up) { |
1928 | scic->power_control.phys_granted_power++; | 1910 | ihost->power_control.phys_granted_power++; |
1929 | scic_sds_phy_consume_power_handler(iphy); | 1911 | scic_sds_phy_consume_power_handler(iphy); |
1930 | 1912 | ||
1931 | /* | 1913 | /* |
1932 | * stop and start the power_control timer. When the timer fires, the | 1914 | * stop and start the power_control timer. When the timer fires, the |
1933 | * no_of_phys_granted_power will be set to 0 | 1915 | * no_of_phys_granted_power will be set to 0 |
1934 | */ | 1916 | */ |
1935 | if (scic->power_control.timer_started) | 1917 | if (ihost->power_control.timer_started) |
1936 | sci_del_timer(&scic->power_control.timer); | 1918 | sci_del_timer(&ihost->power_control.timer); |
1937 | 1919 | ||
1938 | sci_mod_timer(&scic->power_control.timer, | 1920 | sci_mod_timer(&ihost->power_control.timer, |
1939 | SCIC_SDS_CONTROLLER_POWER_CONTROL_INTERVAL); | 1921 | SCIC_SDS_CONTROLLER_POWER_CONTROL_INTERVAL); |
1940 | scic->power_control.timer_started = true; | 1922 | ihost->power_control.timer_started = true; |
1941 | 1923 | ||
1942 | } else { | 1924 | } else { |
1943 | /* Add the phy in the waiting list */ | 1925 | /* Add the phy in the waiting list */ |
1944 | scic->power_control.requesters[iphy->phy_index] = iphy; | 1926 | ihost->power_control.requesters[iphy->phy_index] = iphy; |
1945 | scic->power_control.phys_waiting++; | 1927 | ihost->power_control.phys_waiting++; |
1946 | } | 1928 | } |
1947 | } | 1929 | } |
1948 | 1930 | ||
@@ -1953,16 +1935,16 @@ void scic_sds_controller_power_control_queue_insert( | |||
1953 | * | 1935 | * |
1954 | */ | 1936 | */ |
1955 | void scic_sds_controller_power_control_queue_remove( | 1937 | void scic_sds_controller_power_control_queue_remove( |
1956 | struct scic_sds_controller *scic, | 1938 | struct isci_host *ihost, |
1957 | struct isci_phy *iphy) | 1939 | struct isci_phy *iphy) |
1958 | { | 1940 | { |
1959 | BUG_ON(iphy == NULL); | 1941 | BUG_ON(iphy == NULL); |
1960 | 1942 | ||
1961 | if (scic->power_control.requesters[iphy->phy_index] != NULL) { | 1943 | if (ihost->power_control.requesters[iphy->phy_index] != NULL) { |
1962 | scic->power_control.phys_waiting--; | 1944 | ihost->power_control.phys_waiting--; |
1963 | } | 1945 | } |
1964 | 1946 | ||
1965 | scic->power_control.requesters[iphy->phy_index] = NULL; | 1947 | ihost->power_control.requesters[iphy->phy_index] = NULL; |
1966 | } | 1948 | } |
1967 | 1949 | ||
1968 | #define AFE_REGISTER_WRITE_DELAY 10 | 1950 | #define AFE_REGISTER_WRITE_DELAY 10 |
@@ -1970,50 +1952,50 @@ void scic_sds_controller_power_control_queue_remove( | |||
1970 | /* Initialize the AFE for this phy index. We need to read the AFE setup from | 1952 | /* Initialize the AFE for this phy index. We need to read the AFE setup from |
1971 | * the OEM parameters | 1953 | * the OEM parameters |
1972 | */ | 1954 | */ |
1973 | static void scic_sds_controller_afe_initialization(struct scic_sds_controller *scic) | 1955 | static void scic_sds_controller_afe_initialization(struct isci_host *ihost) |
1974 | { | 1956 | { |
1975 | const struct scic_sds_oem_params *oem = &scic->oem_parameters.sds1; | 1957 | const struct scic_sds_oem_params *oem = &ihost->oem_parameters.sds1; |
1976 | u32 afe_status; | 1958 | u32 afe_status; |
1977 | u32 phy_id; | 1959 | u32 phy_id; |
1978 | 1960 | ||
1979 | /* Clear DFX Status registers */ | 1961 | /* Clear DFX Status registers */ |
1980 | writel(0x0081000f, &scic->scu_registers->afe.afe_dfx_master_control0); | 1962 | writel(0x0081000f, &ihost->scu_registers->afe.afe_dfx_master_control0); |
1981 | udelay(AFE_REGISTER_WRITE_DELAY); | 1963 | udelay(AFE_REGISTER_WRITE_DELAY); |
1982 | 1964 | ||
1983 | if (is_b0()) { | 1965 | if (is_b0()) { |
1984 | /* PM Rx Equalization Save, PM SPhy Rx Acknowledgement | 1966 | /* PM Rx Equalization Save, PM SPhy Rx Acknowledgement |
1985 | * Timer, PM Stagger Timer */ | 1967 | * Timer, PM Stagger Timer */ |
1986 | writel(0x0007BFFF, &scic->scu_registers->afe.afe_pmsn_master_control2); | 1968 | writel(0x0007BFFF, &ihost->scu_registers->afe.afe_pmsn_master_control2); |
1987 | udelay(AFE_REGISTER_WRITE_DELAY); | 1969 | udelay(AFE_REGISTER_WRITE_DELAY); |
1988 | } | 1970 | } |
1989 | 1971 | ||
1990 | /* Configure bias currents to normal */ | 1972 | /* Configure bias currents to normal */ |
1991 | if (is_a0()) | 1973 | if (is_a0()) |
1992 | writel(0x00005500, &scic->scu_registers->afe.afe_bias_control); | 1974 | writel(0x00005500, &ihost->scu_registers->afe.afe_bias_control); |
1993 | else if (is_a2()) | 1975 | else if (is_a2()) |
1994 | writel(0x00005A00, &scic->scu_registers->afe.afe_bias_control); | 1976 | writel(0x00005A00, &ihost->scu_registers->afe.afe_bias_control); |
1995 | else if (is_b0() || is_c0()) | 1977 | else if (is_b0() || is_c0()) |
1996 | writel(0x00005F00, &scic->scu_registers->afe.afe_bias_control); | 1978 | writel(0x00005F00, &ihost->scu_registers->afe.afe_bias_control); |
1997 | 1979 | ||
1998 | udelay(AFE_REGISTER_WRITE_DELAY); | 1980 | udelay(AFE_REGISTER_WRITE_DELAY); |
1999 | 1981 | ||
2000 | /* Enable PLL */ | 1982 | /* Enable PLL */ |
2001 | if (is_b0() || is_c0()) | 1983 | if (is_b0() || is_c0()) |
2002 | writel(0x80040A08, &scic->scu_registers->afe.afe_pll_control0); | 1984 | writel(0x80040A08, &ihost->scu_registers->afe.afe_pll_control0); |
2003 | else | 1985 | else |
2004 | writel(0x80040908, &scic->scu_registers->afe.afe_pll_control0); | 1986 | writel(0x80040908, &ihost->scu_registers->afe.afe_pll_control0); |
2005 | 1987 | ||
2006 | udelay(AFE_REGISTER_WRITE_DELAY); | 1988 | udelay(AFE_REGISTER_WRITE_DELAY); |
2007 | 1989 | ||
2008 | /* Wait for the PLL to lock */ | 1990 | /* Wait for the PLL to lock */ |
2009 | do { | 1991 | do { |
2010 | afe_status = readl(&scic->scu_registers->afe.afe_common_block_status); | 1992 | afe_status = readl(&ihost->scu_registers->afe.afe_common_block_status); |
2011 | udelay(AFE_REGISTER_WRITE_DELAY); | 1993 | udelay(AFE_REGISTER_WRITE_DELAY); |
2012 | } while ((afe_status & 0x00001000) == 0); | 1994 | } while ((afe_status & 0x00001000) == 0); |
2013 | 1995 | ||
2014 | if (is_a0() || is_a2()) { | 1996 | if (is_a0() || is_a2()) { |
2015 | /* Shorten SAS SNW lock time (RxLock timer value from 76 us to 50 us) */ | 1997 | /* Shorten SAS SNW lock time (RxLock timer value from 76 us to 50 us) */ |
2016 | writel(0x7bcc96ad, &scic->scu_registers->afe.afe_pmsn_master_control0); | 1998 | writel(0x7bcc96ad, &ihost->scu_registers->afe.afe_pmsn_master_control0); |
2017 | udelay(AFE_REGISTER_WRITE_DELAY); | 1999 | udelay(AFE_REGISTER_WRITE_DELAY); |
2018 | } | 2000 | } |
2019 | 2001 | ||
@@ -2022,26 +2004,26 @@ static void scic_sds_controller_afe_initialization(struct scic_sds_controller *s | |||
2022 | 2004 | ||
2023 | if (is_b0()) { | 2005 | if (is_b0()) { |
2024 | /* Configure transmitter SSC parameters */ | 2006 | /* Configure transmitter SSC parameters */ |
2025 | writel(0x00030000, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_ssc_control); | 2007 | writel(0x00030000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_ssc_control); |
2026 | udelay(AFE_REGISTER_WRITE_DELAY); | 2008 | udelay(AFE_REGISTER_WRITE_DELAY); |
2027 | } else if (is_c0()) { | 2009 | } else if (is_c0()) { |
2028 | /* Configure transmitter SSC parameters */ | 2010 | /* Configure transmitter SSC parameters */ |
2029 | writel(0x0003000, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_ssc_control); | 2011 | writel(0x0003000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_ssc_control); |
2030 | udelay(AFE_REGISTER_WRITE_DELAY); | 2012 | udelay(AFE_REGISTER_WRITE_DELAY); |
2031 | 2013 | ||
2032 | /* | 2014 | /* |
2033 | * All defaults, except the Receive Word Alignament/Comma Detect | 2015 | * All defaults, except the Receive Word Alignament/Comma Detect |
2034 | * Enable....(0xe800) */ | 2016 | * Enable....(0xe800) */ |
2035 | writel(0x00004500, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control0); | 2017 | writel(0x00004500, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control0); |
2036 | udelay(AFE_REGISTER_WRITE_DELAY); | 2018 | udelay(AFE_REGISTER_WRITE_DELAY); |
2037 | } else { | 2019 | } else { |
2038 | /* | 2020 | /* |
2039 | * All defaults, except the Receive Word Alignament/Comma Detect | 2021 | * All defaults, except the Receive Word Alignament/Comma Detect |
2040 | * Enable....(0xe800) */ | 2022 | * Enable....(0xe800) */ |
2041 | writel(0x00004512, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control0); | 2023 | writel(0x00004512, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control0); |
2042 | udelay(AFE_REGISTER_WRITE_DELAY); | 2024 | udelay(AFE_REGISTER_WRITE_DELAY); |
2043 | 2025 | ||
2044 | writel(0x0050100F, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control1); | 2026 | writel(0x0050100F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control1); |
2045 | udelay(AFE_REGISTER_WRITE_DELAY); | 2027 | udelay(AFE_REGISTER_WRITE_DELAY); |
2046 | } | 2028 | } |
2047 | 2029 | ||
@@ -2049,106 +2031,105 @@ static void scic_sds_controller_afe_initialization(struct scic_sds_controller *s | |||
2049 | * Power up TX and RX out from power down (PWRDNTX and PWRDNRX) | 2031 | * Power up TX and RX out from power down (PWRDNTX and PWRDNRX) |
2050 | * & increase TX int & ext bias 20%....(0xe85c) */ | 2032 | * & increase TX int & ext bias 20%....(0xe85c) */ |
2051 | if (is_a0()) | 2033 | if (is_a0()) |
2052 | writel(0x000003D4, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); | 2034 | writel(0x000003D4, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); |
2053 | else if (is_a2()) | 2035 | else if (is_a2()) |
2054 | writel(0x000003F0, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); | 2036 | writel(0x000003F0, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); |
2055 | else if (is_b0()) { | 2037 | else if (is_b0()) { |
2056 | /* Power down TX and RX (PWRDNTX and PWRDNRX) */ | 2038 | /* Power down TX and RX (PWRDNTX and PWRDNRX) */ |
2057 | writel(0x000003D7, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); | 2039 | writel(0x000003D7, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); |
2058 | udelay(AFE_REGISTER_WRITE_DELAY); | 2040 | udelay(AFE_REGISTER_WRITE_DELAY); |
2059 | 2041 | ||
2060 | /* | 2042 | /* |
2061 | * Power up TX and RX out from power down (PWRDNTX and PWRDNRX) | 2043 | * Power up TX and RX out from power down (PWRDNTX and PWRDNRX) |
2062 | * & increase TX int & ext bias 20%....(0xe85c) */ | 2044 | * & increase TX int & ext bias 20%....(0xe85c) */ |
2063 | writel(0x000003D4, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); | 2045 | writel(0x000003D4, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); |
2064 | } else { | 2046 | } else { |
2065 | writel(0x000001E7, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); | 2047 | writel(0x000001E7, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); |
2066 | udelay(AFE_REGISTER_WRITE_DELAY); | 2048 | udelay(AFE_REGISTER_WRITE_DELAY); |
2067 | 2049 | ||
2068 | /* | 2050 | /* |
2069 | * Power up TX and RX out from power down (PWRDNTX and PWRDNRX) | 2051 | * Power up TX and RX out from power down (PWRDNTX and PWRDNRX) |
2070 | * & increase TX int & ext bias 20%....(0xe85c) */ | 2052 | * & increase TX int & ext bias 20%....(0xe85c) */ |
2071 | writel(0x000001E4, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); | 2053 | writel(0x000001E4, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control); |
2072 | } | 2054 | } |
2073 | udelay(AFE_REGISTER_WRITE_DELAY); | 2055 | udelay(AFE_REGISTER_WRITE_DELAY); |
2074 | 2056 | ||
2075 | if (is_a0() || is_a2()) { | 2057 | if (is_a0() || is_a2()) { |
2076 | /* Enable TX equalization (0xe824) */ | 2058 | /* Enable TX equalization (0xe824) */ |
2077 | writel(0x00040000, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control); | 2059 | writel(0x00040000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control); |
2078 | udelay(AFE_REGISTER_WRITE_DELAY); | 2060 | udelay(AFE_REGISTER_WRITE_DELAY); |
2079 | } | 2061 | } |
2080 | 2062 | ||
2081 | /* | 2063 | /* |
2082 | * RDPI=0x0(RX Power On), RXOOBDETPDNC=0x0, TPD=0x0(TX Power On), | 2064 | * RDPI=0x0(RX Power On), RXOOBDETPDNC=0x0, TPD=0x0(TX Power On), |
2083 | * RDD=0x0(RX Detect Enabled) ....(0xe800) */ | 2065 | * RDD=0x0(RX Detect Enabled) ....(0xe800) */ |
2084 | writel(0x00004100, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control0); | 2066 | writel(0x00004100, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_xcvr_control0); |
2085 | udelay(AFE_REGISTER_WRITE_DELAY); | 2067 | udelay(AFE_REGISTER_WRITE_DELAY); |
2086 | 2068 | ||
2087 | /* Leave DFE/FFE on */ | 2069 | /* Leave DFE/FFE on */ |
2088 | if (is_a0()) | 2070 | if (is_a0()) |
2089 | writel(0x3F09983F, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); | 2071 | writel(0x3F09983F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); |
2090 | else if (is_a2()) | 2072 | else if (is_a2()) |
2091 | writel(0x3F11103F, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); | 2073 | writel(0x3F11103F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); |
2092 | else if (is_b0()) { | 2074 | else if (is_b0()) { |
2093 | writel(0x3F11103F, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); | 2075 | writel(0x3F11103F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); |
2094 | udelay(AFE_REGISTER_WRITE_DELAY); | 2076 | udelay(AFE_REGISTER_WRITE_DELAY); |
2095 | /* Enable TX equalization (0xe824) */ | 2077 | /* Enable TX equalization (0xe824) */ |
2096 | writel(0x00040000, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control); | 2078 | writel(0x00040000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control); |
2097 | } else { | 2079 | } else { |
2098 | writel(0x0140DF0F, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control1); | 2080 | writel(0x0140DF0F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control1); |
2099 | udelay(AFE_REGISTER_WRITE_DELAY); | 2081 | udelay(AFE_REGISTER_WRITE_DELAY); |
2100 | 2082 | ||
2101 | writel(0x3F6F103F, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); | 2083 | writel(0x3F6F103F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0); |
2102 | udelay(AFE_REGISTER_WRITE_DELAY); | 2084 | udelay(AFE_REGISTER_WRITE_DELAY); |
2103 | 2085 | ||
2104 | /* Enable TX equalization (0xe824) */ | 2086 | /* Enable TX equalization (0xe824) */ |
2105 | writel(0x00040000, &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control); | 2087 | writel(0x00040000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control); |
2106 | } | 2088 | } |
2107 | 2089 | ||
2108 | udelay(AFE_REGISTER_WRITE_DELAY); | 2090 | udelay(AFE_REGISTER_WRITE_DELAY); |
2109 | 2091 | ||
2110 | writel(oem_phy->afe_tx_amp_control0, | 2092 | writel(oem_phy->afe_tx_amp_control0, |
2111 | &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control0); | 2093 | &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control0); |
2112 | udelay(AFE_REGISTER_WRITE_DELAY); | 2094 | udelay(AFE_REGISTER_WRITE_DELAY); |
2113 | 2095 | ||
2114 | writel(oem_phy->afe_tx_amp_control1, | 2096 | writel(oem_phy->afe_tx_amp_control1, |
2115 | &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control1); | 2097 | &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control1); |
2116 | udelay(AFE_REGISTER_WRITE_DELAY); | 2098 | udelay(AFE_REGISTER_WRITE_DELAY); |
2117 | 2099 | ||
2118 | writel(oem_phy->afe_tx_amp_control2, | 2100 | writel(oem_phy->afe_tx_amp_control2, |
2119 | &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control2); | 2101 | &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control2); |
2120 | udelay(AFE_REGISTER_WRITE_DELAY); | 2102 | udelay(AFE_REGISTER_WRITE_DELAY); |
2121 | 2103 | ||
2122 | writel(oem_phy->afe_tx_amp_control3, | 2104 | writel(oem_phy->afe_tx_amp_control3, |
2123 | &scic->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control3); | 2105 | &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_amp_control3); |
2124 | udelay(AFE_REGISTER_WRITE_DELAY); | 2106 | udelay(AFE_REGISTER_WRITE_DELAY); |
2125 | } | 2107 | } |
2126 | 2108 | ||
2127 | /* Transfer control to the PEs */ | 2109 | /* Transfer control to the PEs */ |
2128 | writel(0x00010f00, &scic->scu_registers->afe.afe_dfx_master_control0); | 2110 | writel(0x00010f00, &ihost->scu_registers->afe.afe_dfx_master_control0); |
2129 | udelay(AFE_REGISTER_WRITE_DELAY); | 2111 | udelay(AFE_REGISTER_WRITE_DELAY); |
2130 | } | 2112 | } |
2131 | 2113 | ||
2132 | static void scic_sds_controller_initialize_power_control(struct scic_sds_controller *scic) | 2114 | static void scic_sds_controller_initialize_power_control(struct isci_host *ihost) |
2133 | { | 2115 | { |
2134 | sci_init_timer(&scic->power_control.timer, power_control_timeout); | 2116 | sci_init_timer(&ihost->power_control.timer, power_control_timeout); |
2135 | 2117 | ||
2136 | memset(scic->power_control.requesters, 0, | 2118 | memset(ihost->power_control.requesters, 0, |
2137 | sizeof(scic->power_control.requesters)); | 2119 | sizeof(ihost->power_control.requesters)); |
2138 | 2120 | ||
2139 | scic->power_control.phys_waiting = 0; | 2121 | ihost->power_control.phys_waiting = 0; |
2140 | scic->power_control.phys_granted_power = 0; | 2122 | ihost->power_control.phys_granted_power = 0; |
2141 | } | 2123 | } |
2142 | 2124 | ||
2143 | static enum sci_status scic_controller_initialize(struct scic_sds_controller *scic) | 2125 | static enum sci_status scic_controller_initialize(struct isci_host *ihost) |
2144 | { | 2126 | { |
2145 | struct sci_base_state_machine *sm = &scic->sm; | 2127 | struct sci_base_state_machine *sm = &ihost->sm; |
2146 | struct isci_host *ihost = scic_to_ihost(scic); | ||
2147 | enum sci_status result = SCI_FAILURE; | 2128 | enum sci_status result = SCI_FAILURE; |
2148 | unsigned long i, state, val; | 2129 | unsigned long i, state, val; |
2149 | 2130 | ||
2150 | if (scic->sm.current_state_id != SCIC_RESET) { | 2131 | if (ihost->sm.current_state_id != SCIC_RESET) { |
2151 | dev_warn(scic_to_dev(scic), | 2132 | dev_warn(&ihost->pdev->dev, |
2152 | "SCIC Controller initialize operation requested " | 2133 | "SCIC Controller initialize operation requested " |
2153 | "in invalid state\n"); | 2134 | "in invalid state\n"); |
2154 | return SCI_FAILURE_INVALID_STATE; | 2135 | return SCI_FAILURE_INVALID_STATE; |
@@ -2156,23 +2137,23 @@ static enum sci_status scic_controller_initialize(struct scic_sds_controller *sc | |||
2156 | 2137 | ||
2157 | sci_change_state(sm, SCIC_INITIALIZING); | 2138 | sci_change_state(sm, SCIC_INITIALIZING); |
2158 | 2139 | ||
2159 | sci_init_timer(&scic->phy_timer, phy_startup_timeout); | 2140 | sci_init_timer(&ihost->phy_timer, phy_startup_timeout); |
2160 | 2141 | ||
2161 | scic->next_phy_to_start = 0; | 2142 | ihost->next_phy_to_start = 0; |
2162 | scic->phy_startup_timer_pending = false; | 2143 | ihost->phy_startup_timer_pending = false; |
2163 | 2144 | ||
2164 | scic_sds_controller_initialize_power_control(scic); | 2145 | scic_sds_controller_initialize_power_control(ihost); |
2165 | 2146 | ||
2166 | /* | 2147 | /* |
2167 | * There is nothing to do here for B0 since we do not have to | 2148 | * There is nothing to do here for B0 since we do not have to |
2168 | * program the AFE registers. | 2149 | * program the AFE registers. |
2169 | * / @todo The AFE settings are supposed to be correct for the B0 but | 2150 | * / @todo The AFE settings are supposed to be correct for the B0 but |
2170 | * / presently they seem to be wrong. */ | 2151 | * / presently they seem to be wrong. */ |
2171 | scic_sds_controller_afe_initialization(scic); | 2152 | scic_sds_controller_afe_initialization(ihost); |
2172 | 2153 | ||
2173 | 2154 | ||
2174 | /* Take the hardware out of reset */ | 2155 | /* Take the hardware out of reset */ |
2175 | writel(0, &scic->smu_registers->soft_reset_control); | 2156 | writel(0, &ihost->smu_registers->soft_reset_control); |
2176 | 2157 | ||
2177 | /* | 2158 | /* |
2178 | * / @todo Provide meaningfull error code for hardware failure | 2159 | * / @todo Provide meaningfull error code for hardware failure |
@@ -2182,7 +2163,7 @@ static enum sci_status scic_controller_initialize(struct scic_sds_controller *sc | |||
2182 | 2163 | ||
2183 | /* Loop until the hardware reports success */ | 2164 | /* Loop until the hardware reports success */ |
2184 | udelay(SCU_CONTEXT_RAM_INIT_STALL_TIME); | 2165 | udelay(SCU_CONTEXT_RAM_INIT_STALL_TIME); |
2185 | status = readl(&scic->smu_registers->control_status); | 2166 | status = readl(&ihost->smu_registers->control_status); |
2186 | 2167 | ||
2187 | if ((status & SCU_RAM_INIT_COMPLETED) == SCU_RAM_INIT_COMPLETED) | 2168 | if ((status & SCU_RAM_INIT_COMPLETED) == SCU_RAM_INIT_COMPLETED) |
2188 | break; | 2169 | break; |
@@ -2193,32 +2174,32 @@ static enum sci_status scic_controller_initialize(struct scic_sds_controller *sc | |||
2193 | /* | 2174 | /* |
2194 | * Determine what are the actaul device capacities that the | 2175 | * Determine what are the actaul device capacities that the |
2195 | * hardware will support */ | 2176 | * hardware will support */ |
2196 | val = readl(&scic->smu_registers->device_context_capacity); | 2177 | val = readl(&ihost->smu_registers->device_context_capacity); |
2197 | 2178 | ||
2198 | /* Record the smaller of the two capacity values */ | 2179 | /* Record the smaller of the two capacity values */ |
2199 | scic->logical_port_entries = min(smu_max_ports(val), SCI_MAX_PORTS); | 2180 | ihost->logical_port_entries = min(smu_max_ports(val), SCI_MAX_PORTS); |
2200 | scic->task_context_entries = min(smu_max_task_contexts(val), SCI_MAX_IO_REQUESTS); | 2181 | ihost->task_context_entries = min(smu_max_task_contexts(val), SCI_MAX_IO_REQUESTS); |
2201 | scic->remote_node_entries = min(smu_max_rncs(val), SCI_MAX_REMOTE_DEVICES); | 2182 | ihost->remote_node_entries = min(smu_max_rncs(val), SCI_MAX_REMOTE_DEVICES); |
2202 | 2183 | ||
2203 | /* | 2184 | /* |
2204 | * Make all PEs that are unassigned match up with the | 2185 | * Make all PEs that are unassigned match up with the |
2205 | * logical ports | 2186 | * logical ports |
2206 | */ | 2187 | */ |
2207 | for (i = 0; i < scic->logical_port_entries; i++) { | 2188 | for (i = 0; i < ihost->logical_port_entries; i++) { |
2208 | struct scu_port_task_scheduler_group_registers __iomem | 2189 | struct scu_port_task_scheduler_group_registers __iomem |
2209 | *ptsg = &scic->scu_registers->peg0.ptsg; | 2190 | *ptsg = &ihost->scu_registers->peg0.ptsg; |
2210 | 2191 | ||
2211 | writel(i, &ptsg->protocol_engine[i]); | 2192 | writel(i, &ptsg->protocol_engine[i]); |
2212 | } | 2193 | } |
2213 | 2194 | ||
2214 | /* Initialize hardware PCI Relaxed ordering in DMA engines */ | 2195 | /* Initialize hardware PCI Relaxed ordering in DMA engines */ |
2215 | val = readl(&scic->scu_registers->sdma.pdma_configuration); | 2196 | val = readl(&ihost->scu_registers->sdma.pdma_configuration); |
2216 | val |= SCU_PDMACR_GEN_BIT(PCI_RELAXED_ORDERING_ENABLE); | 2197 | val |= SCU_PDMACR_GEN_BIT(PCI_RELAXED_ORDERING_ENABLE); |
2217 | writel(val, &scic->scu_registers->sdma.pdma_configuration); | 2198 | writel(val, &ihost->scu_registers->sdma.pdma_configuration); |
2218 | 2199 | ||
2219 | val = readl(&scic->scu_registers->sdma.cdma_configuration); | 2200 | val = readl(&ihost->scu_registers->sdma.cdma_configuration); |
2220 | val |= SCU_CDMACR_GEN_BIT(PCI_RELAXED_ORDERING_ENABLE); | 2201 | val |= SCU_CDMACR_GEN_BIT(PCI_RELAXED_ORDERING_ENABLE); |
2221 | writel(val, &scic->scu_registers->sdma.cdma_configuration); | 2202 | writel(val, &ihost->scu_registers->sdma.cdma_configuration); |
2222 | 2203 | ||
2223 | /* | 2204 | /* |
2224 | * Initialize the PHYs before the PORTs because the PHY registers | 2205 | * Initialize the PHYs before the PORTs because the PHY registers |
@@ -2226,23 +2207,23 @@ static enum sci_status scic_controller_initialize(struct scic_sds_controller *sc | |||
2226 | */ | 2207 | */ |
2227 | for (i = 0; i < SCI_MAX_PHYS; i++) { | 2208 | for (i = 0; i < SCI_MAX_PHYS; i++) { |
2228 | result = scic_sds_phy_initialize(&ihost->phys[i], | 2209 | result = scic_sds_phy_initialize(&ihost->phys[i], |
2229 | &scic->scu_registers->peg0.pe[i].tl, | 2210 | &ihost->scu_registers->peg0.pe[i].tl, |
2230 | &scic->scu_registers->peg0.pe[i].ll); | 2211 | &ihost->scu_registers->peg0.pe[i].ll); |
2231 | if (result != SCI_SUCCESS) | 2212 | if (result != SCI_SUCCESS) |
2232 | goto out; | 2213 | goto out; |
2233 | } | 2214 | } |
2234 | 2215 | ||
2235 | for (i = 0; i < scic->logical_port_entries; i++) { | 2216 | for (i = 0; i < ihost->logical_port_entries; i++) { |
2236 | result = scic_sds_port_initialize(&ihost->ports[i], | 2217 | result = scic_sds_port_initialize(&ihost->ports[i], |
2237 | &scic->scu_registers->peg0.ptsg.port[i], | 2218 | &ihost->scu_registers->peg0.ptsg.port[i], |
2238 | &scic->scu_registers->peg0.ptsg.protocol_engine, | 2219 | &ihost->scu_registers->peg0.ptsg.protocol_engine, |
2239 | &scic->scu_registers->peg0.viit[i]); | 2220 | &ihost->scu_registers->peg0.viit[i]); |
2240 | 2221 | ||
2241 | if (result != SCI_SUCCESS) | 2222 | if (result != SCI_SUCCESS) |
2242 | goto out; | 2223 | goto out; |
2243 | } | 2224 | } |
2244 | 2225 | ||
2245 | result = scic_sds_port_configuration_agent_initialize(scic, &scic->port_agent); | 2226 | result = scic_sds_port_configuration_agent_initialize(ihost, &ihost->port_agent); |
2246 | 2227 | ||
2247 | out: | 2228 | out: |
2248 | /* Advance the controller state machine */ | 2229 | /* Advance the controller state machine */ |
@@ -2256,10 +2237,10 @@ static enum sci_status scic_controller_initialize(struct scic_sds_controller *sc | |||
2256 | } | 2237 | } |
2257 | 2238 | ||
2258 | static enum sci_status scic_user_parameters_set( | 2239 | static enum sci_status scic_user_parameters_set( |
2259 | struct scic_sds_controller *scic, | 2240 | struct isci_host *ihost, |
2260 | union scic_user_parameters *scic_parms) | 2241 | union scic_user_parameters *scic_parms) |
2261 | { | 2242 | { |
2262 | u32 state = scic->sm.current_state_id; | 2243 | u32 state = ihost->sm.current_state_id; |
2263 | 2244 | ||
2264 | if (state == SCIC_RESET || | 2245 | if (state == SCIC_RESET || |
2265 | state == SCIC_INITIALIZING || | 2246 | state == SCIC_INITIALIZING || |
@@ -2301,7 +2282,7 @@ static enum sci_status scic_user_parameters_set( | |||
2301 | (scic_parms->sds1.no_outbound_task_timeout == 0)) | 2282 | (scic_parms->sds1.no_outbound_task_timeout == 0)) |
2302 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2283 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2303 | 2284 | ||
2304 | memcpy(&scic->user_parameters, scic_parms, sizeof(*scic_parms)); | 2285 | memcpy(&ihost->user_parameters, scic_parms, sizeof(*scic_parms)); |
2305 | 2286 | ||
2306 | return SCI_SUCCESS; | 2287 | return SCI_SUCCESS; |
2307 | } | 2288 | } |
@@ -2309,40 +2290,40 @@ static enum sci_status scic_user_parameters_set( | |||
2309 | return SCI_FAILURE_INVALID_STATE; | 2290 | return SCI_FAILURE_INVALID_STATE; |
2310 | } | 2291 | } |
2311 | 2292 | ||
2312 | static int scic_controller_mem_init(struct scic_sds_controller *scic) | 2293 | static int scic_controller_mem_init(struct isci_host *ihost) |
2313 | { | 2294 | { |
2314 | struct device *dev = scic_to_dev(scic); | 2295 | struct device *dev = &ihost->pdev->dev; |
2315 | dma_addr_t dma; | 2296 | dma_addr_t dma; |
2316 | size_t size; | 2297 | size_t size; |
2317 | int err; | 2298 | int err; |
2318 | 2299 | ||
2319 | size = SCU_MAX_COMPLETION_QUEUE_ENTRIES * sizeof(u32); | 2300 | size = SCU_MAX_COMPLETION_QUEUE_ENTRIES * sizeof(u32); |
2320 | scic->completion_queue = dmam_alloc_coherent(dev, size, &dma, GFP_KERNEL); | 2301 | ihost->completion_queue = dmam_alloc_coherent(dev, size, &dma, GFP_KERNEL); |
2321 | if (!scic->completion_queue) | 2302 | if (!ihost->completion_queue) |
2322 | return -ENOMEM; | 2303 | return -ENOMEM; |
2323 | 2304 | ||
2324 | writel(lower_32_bits(dma), &scic->smu_registers->completion_queue_lower); | 2305 | writel(lower_32_bits(dma), &ihost->smu_registers->completion_queue_lower); |
2325 | writel(upper_32_bits(dma), &scic->smu_registers->completion_queue_upper); | 2306 | writel(upper_32_bits(dma), &ihost->smu_registers->completion_queue_upper); |
2326 | 2307 | ||
2327 | size = scic->remote_node_entries * sizeof(union scu_remote_node_context); | 2308 | size = ihost->remote_node_entries * sizeof(union scu_remote_node_context); |
2328 | scic->remote_node_context_table = dmam_alloc_coherent(dev, size, &dma, | 2309 | ihost->remote_node_context_table = dmam_alloc_coherent(dev, size, &dma, |
2329 | GFP_KERNEL); | 2310 | GFP_KERNEL); |
2330 | if (!scic->remote_node_context_table) | 2311 | if (!ihost->remote_node_context_table) |
2331 | return -ENOMEM; | 2312 | return -ENOMEM; |
2332 | 2313 | ||
2333 | writel(lower_32_bits(dma), &scic->smu_registers->remote_node_context_lower); | 2314 | writel(lower_32_bits(dma), &ihost->smu_registers->remote_node_context_lower); |
2334 | writel(upper_32_bits(dma), &scic->smu_registers->remote_node_context_upper); | 2315 | writel(upper_32_bits(dma), &ihost->smu_registers->remote_node_context_upper); |
2335 | 2316 | ||
2336 | size = scic->task_context_entries * sizeof(struct scu_task_context), | 2317 | size = ihost->task_context_entries * sizeof(struct scu_task_context), |
2337 | scic->task_context_table = dmam_alloc_coherent(dev, size, &dma, GFP_KERNEL); | 2318 | ihost->task_context_table = dmam_alloc_coherent(dev, size, &dma, GFP_KERNEL); |
2338 | if (!scic->task_context_table) | 2319 | if (!ihost->task_context_table) |
2339 | return -ENOMEM; | 2320 | return -ENOMEM; |
2340 | 2321 | ||
2341 | scic->task_context_dma = dma; | 2322 | ihost->task_context_dma = dma; |
2342 | writel(lower_32_bits(dma), &scic->smu_registers->host_task_table_lower); | 2323 | writel(lower_32_bits(dma), &ihost->smu_registers->host_task_table_lower); |
2343 | writel(upper_32_bits(dma), &scic->smu_registers->host_task_table_upper); | 2324 | writel(upper_32_bits(dma), &ihost->smu_registers->host_task_table_upper); |
2344 | 2325 | ||
2345 | err = scic_sds_unsolicited_frame_control_construct(scic); | 2326 | err = scic_sds_unsolicited_frame_control_construct(ihost); |
2346 | if (err) | 2327 | if (err) |
2347 | return err; | 2328 | return err; |
2348 | 2329 | ||
@@ -2350,112 +2331,112 @@ static int scic_controller_mem_init(struct scic_sds_controller *scic) | |||
2350 | * Inform the silicon as to the location of the UF headers and | 2331 | * Inform the silicon as to the location of the UF headers and |
2351 | * address table. | 2332 | * address table. |
2352 | */ | 2333 | */ |
2353 | writel(lower_32_bits(scic->uf_control.headers.physical_address), | 2334 | writel(lower_32_bits(ihost->uf_control.headers.physical_address), |
2354 | &scic->scu_registers->sdma.uf_header_base_address_lower); | 2335 | &ihost->scu_registers->sdma.uf_header_base_address_lower); |
2355 | writel(upper_32_bits(scic->uf_control.headers.physical_address), | 2336 | writel(upper_32_bits(ihost->uf_control.headers.physical_address), |
2356 | &scic->scu_registers->sdma.uf_header_base_address_upper); | 2337 | &ihost->scu_registers->sdma.uf_header_base_address_upper); |
2357 | 2338 | ||
2358 | writel(lower_32_bits(scic->uf_control.address_table.physical_address), | 2339 | writel(lower_32_bits(ihost->uf_control.address_table.physical_address), |
2359 | &scic->scu_registers->sdma.uf_address_table_lower); | 2340 | &ihost->scu_registers->sdma.uf_address_table_lower); |
2360 | writel(upper_32_bits(scic->uf_control.address_table.physical_address), | 2341 | writel(upper_32_bits(ihost->uf_control.address_table.physical_address), |
2361 | &scic->scu_registers->sdma.uf_address_table_upper); | 2342 | &ihost->scu_registers->sdma.uf_address_table_upper); |
2362 | 2343 | ||
2363 | return 0; | 2344 | return 0; |
2364 | } | 2345 | } |
2365 | 2346 | ||
2366 | int isci_host_init(struct isci_host *isci_host) | 2347 | int isci_host_init(struct isci_host *ihost) |
2367 | { | 2348 | { |
2368 | int err = 0, i; | 2349 | int err = 0, i; |
2369 | enum sci_status status; | 2350 | enum sci_status status; |
2370 | union scic_oem_parameters oem; | 2351 | union scic_oem_parameters oem; |
2371 | union scic_user_parameters scic_user_params; | 2352 | union scic_user_parameters scic_user_params; |
2372 | struct isci_pci_info *pci_info = to_pci_info(isci_host->pdev); | 2353 | struct isci_pci_info *pci_info = to_pci_info(ihost->pdev); |
2373 | 2354 | ||
2374 | spin_lock_init(&isci_host->state_lock); | 2355 | spin_lock_init(&ihost->state_lock); |
2375 | spin_lock_init(&isci_host->scic_lock); | 2356 | spin_lock_init(&ihost->scic_lock); |
2376 | init_waitqueue_head(&isci_host->eventq); | 2357 | init_waitqueue_head(&ihost->eventq); |
2377 | 2358 | ||
2378 | isci_host_change_state(isci_host, isci_starting); | 2359 | isci_host_change_state(ihost, isci_starting); |
2379 | 2360 | ||
2380 | status = scic_controller_construct(&isci_host->sci, scu_base(isci_host), | 2361 | status = scic_controller_construct(ihost, scu_base(ihost), |
2381 | smu_base(isci_host)); | 2362 | smu_base(ihost)); |
2382 | 2363 | ||
2383 | if (status != SCI_SUCCESS) { | 2364 | if (status != SCI_SUCCESS) { |
2384 | dev_err(&isci_host->pdev->dev, | 2365 | dev_err(&ihost->pdev->dev, |
2385 | "%s: scic_controller_construct failed - status = %x\n", | 2366 | "%s: scic_controller_construct failed - status = %x\n", |
2386 | __func__, | 2367 | __func__, |
2387 | status); | 2368 | status); |
2388 | return -ENODEV; | 2369 | return -ENODEV; |
2389 | } | 2370 | } |
2390 | 2371 | ||
2391 | isci_host->sas_ha.dev = &isci_host->pdev->dev; | 2372 | ihost->sas_ha.dev = &ihost->pdev->dev; |
2392 | isci_host->sas_ha.lldd_ha = isci_host; | 2373 | ihost->sas_ha.lldd_ha = ihost; |
2393 | 2374 | ||
2394 | /* | 2375 | /* |
2395 | * grab initial values stored in the controller object for OEM and USER | 2376 | * grab initial values stored in the controller object for OEM and USER |
2396 | * parameters | 2377 | * parameters |
2397 | */ | 2378 | */ |
2398 | isci_user_parameters_get(isci_host, &scic_user_params); | 2379 | isci_user_parameters_get(ihost, &scic_user_params); |
2399 | status = scic_user_parameters_set(&isci_host->sci, | 2380 | status = scic_user_parameters_set(ihost, |
2400 | &scic_user_params); | 2381 | &scic_user_params); |
2401 | if (status != SCI_SUCCESS) { | 2382 | if (status != SCI_SUCCESS) { |
2402 | dev_warn(&isci_host->pdev->dev, | 2383 | dev_warn(&ihost->pdev->dev, |
2403 | "%s: scic_user_parameters_set failed\n", | 2384 | "%s: scic_user_parameters_set failed\n", |
2404 | __func__); | 2385 | __func__); |
2405 | return -ENODEV; | 2386 | return -ENODEV; |
2406 | } | 2387 | } |
2407 | 2388 | ||
2408 | scic_oem_parameters_get(&isci_host->sci, &oem); | 2389 | scic_oem_parameters_get(ihost, &oem); |
2409 | 2390 | ||
2410 | /* grab any OEM parameters specified in orom */ | 2391 | /* grab any OEM parameters specified in orom */ |
2411 | if (pci_info->orom) { | 2392 | if (pci_info->orom) { |
2412 | status = isci_parse_oem_parameters(&oem, | 2393 | status = isci_parse_oem_parameters(&oem, |
2413 | pci_info->orom, | 2394 | pci_info->orom, |
2414 | isci_host->id); | 2395 | ihost->id); |
2415 | if (status != SCI_SUCCESS) { | 2396 | if (status != SCI_SUCCESS) { |
2416 | dev_warn(&isci_host->pdev->dev, | 2397 | dev_warn(&ihost->pdev->dev, |
2417 | "parsing firmware oem parameters failed\n"); | 2398 | "parsing firmware oem parameters failed\n"); |
2418 | return -EINVAL; | 2399 | return -EINVAL; |
2419 | } | 2400 | } |
2420 | } | 2401 | } |
2421 | 2402 | ||
2422 | status = scic_oem_parameters_set(&isci_host->sci, &oem); | 2403 | status = scic_oem_parameters_set(ihost, &oem); |
2423 | if (status != SCI_SUCCESS) { | 2404 | if (status != SCI_SUCCESS) { |
2424 | dev_warn(&isci_host->pdev->dev, | 2405 | dev_warn(&ihost->pdev->dev, |
2425 | "%s: scic_oem_parameters_set failed\n", | 2406 | "%s: scic_oem_parameters_set failed\n", |
2426 | __func__); | 2407 | __func__); |
2427 | return -ENODEV; | 2408 | return -ENODEV; |
2428 | } | 2409 | } |
2429 | 2410 | ||
2430 | tasklet_init(&isci_host->completion_tasklet, | 2411 | tasklet_init(&ihost->completion_tasklet, |
2431 | isci_host_completion_routine, (unsigned long)isci_host); | 2412 | isci_host_completion_routine, (unsigned long)ihost); |
2432 | 2413 | ||
2433 | INIT_LIST_HEAD(&isci_host->requests_to_complete); | 2414 | INIT_LIST_HEAD(&ihost->requests_to_complete); |
2434 | INIT_LIST_HEAD(&isci_host->requests_to_errorback); | 2415 | INIT_LIST_HEAD(&ihost->requests_to_errorback); |
2435 | 2416 | ||
2436 | spin_lock_irq(&isci_host->scic_lock); | 2417 | spin_lock_irq(&ihost->scic_lock); |
2437 | status = scic_controller_initialize(&isci_host->sci); | 2418 | status = scic_controller_initialize(ihost); |
2438 | spin_unlock_irq(&isci_host->scic_lock); | 2419 | spin_unlock_irq(&ihost->scic_lock); |
2439 | if (status != SCI_SUCCESS) { | 2420 | if (status != SCI_SUCCESS) { |
2440 | dev_warn(&isci_host->pdev->dev, | 2421 | dev_warn(&ihost->pdev->dev, |
2441 | "%s: scic_controller_initialize failed -" | 2422 | "%s: scic_controller_initialize failed -" |
2442 | " status = 0x%x\n", | 2423 | " status = 0x%x\n", |
2443 | __func__, status); | 2424 | __func__, status); |
2444 | return -ENODEV; | 2425 | return -ENODEV; |
2445 | } | 2426 | } |
2446 | 2427 | ||
2447 | err = scic_controller_mem_init(&isci_host->sci); | 2428 | err = scic_controller_mem_init(ihost); |
2448 | if (err) | 2429 | if (err) |
2449 | return err; | 2430 | return err; |
2450 | 2431 | ||
2451 | for (i = 0; i < SCI_MAX_PORTS; i++) | 2432 | for (i = 0; i < SCI_MAX_PORTS; i++) |
2452 | isci_port_init(&isci_host->ports[i], isci_host, i); | 2433 | isci_port_init(&ihost->ports[i], ihost, i); |
2453 | 2434 | ||
2454 | for (i = 0; i < SCI_MAX_PHYS; i++) | 2435 | for (i = 0; i < SCI_MAX_PHYS; i++) |
2455 | isci_phy_init(&isci_host->phys[i], isci_host, i); | 2436 | isci_phy_init(&ihost->phys[i], ihost, i); |
2456 | 2437 | ||
2457 | for (i = 0; i < SCI_MAX_REMOTE_DEVICES; i++) { | 2438 | for (i = 0; i < SCI_MAX_REMOTE_DEVICES; i++) { |
2458 | struct isci_remote_device *idev = &isci_host->devices[i]; | 2439 | struct isci_remote_device *idev = &ihost->devices[i]; |
2459 | 2440 | ||
2460 | INIT_LIST_HEAD(&idev->reqs_in_process); | 2441 | INIT_LIST_HEAD(&idev->reqs_in_process); |
2461 | INIT_LIST_HEAD(&idev->node); | 2442 | INIT_LIST_HEAD(&idev->node); |
@@ -2465,63 +2446,62 @@ int isci_host_init(struct isci_host *isci_host) | |||
2465 | struct isci_request *ireq; | 2446 | struct isci_request *ireq; |
2466 | dma_addr_t dma; | 2447 | dma_addr_t dma; |
2467 | 2448 | ||
2468 | ireq = dmam_alloc_coherent(&isci_host->pdev->dev, | 2449 | ireq = dmam_alloc_coherent(&ihost->pdev->dev, |
2469 | sizeof(struct isci_request), &dma, | 2450 | sizeof(struct isci_request), &dma, |
2470 | GFP_KERNEL); | 2451 | GFP_KERNEL); |
2471 | if (!ireq) | 2452 | if (!ireq) |
2472 | return -ENOMEM; | 2453 | return -ENOMEM; |
2473 | 2454 | ||
2474 | ireq->tc = &isci_host->sci.task_context_table[i]; | 2455 | ireq->tc = &ihost->task_context_table[i]; |
2475 | ireq->owning_controller = &isci_host->sci; | 2456 | ireq->owning_controller = ihost; |
2476 | spin_lock_init(&ireq->state_lock); | 2457 | spin_lock_init(&ireq->state_lock); |
2477 | ireq->request_daddr = dma; | 2458 | ireq->request_daddr = dma; |
2478 | ireq->isci_host = isci_host; | 2459 | ireq->isci_host = ihost; |
2479 | 2460 | ihost->reqs[i] = ireq; | |
2480 | isci_host->reqs[i] = ireq; | ||
2481 | } | 2461 | } |
2482 | 2462 | ||
2483 | return 0; | 2463 | return 0; |
2484 | } | 2464 | } |
2485 | 2465 | ||
2486 | void scic_sds_controller_link_up(struct scic_sds_controller *scic, | 2466 | void scic_sds_controller_link_up(struct isci_host *ihost, |
2487 | struct isci_port *iport, struct isci_phy *iphy) | 2467 | struct isci_port *iport, struct isci_phy *iphy) |
2488 | { | 2468 | { |
2489 | switch (scic->sm.current_state_id) { | 2469 | switch (ihost->sm.current_state_id) { |
2490 | case SCIC_STARTING: | 2470 | case SCIC_STARTING: |
2491 | sci_del_timer(&scic->phy_timer); | 2471 | sci_del_timer(&ihost->phy_timer); |
2492 | scic->phy_startup_timer_pending = false; | 2472 | ihost->phy_startup_timer_pending = false; |
2493 | scic->port_agent.link_up_handler(scic, &scic->port_agent, | 2473 | ihost->port_agent.link_up_handler(ihost, &ihost->port_agent, |
2494 | iport, iphy); | 2474 | iport, iphy); |
2495 | scic_sds_controller_start_next_phy(scic); | 2475 | scic_sds_controller_start_next_phy(ihost); |
2496 | break; | 2476 | break; |
2497 | case SCIC_READY: | 2477 | case SCIC_READY: |
2498 | scic->port_agent.link_up_handler(scic, &scic->port_agent, | 2478 | ihost->port_agent.link_up_handler(ihost, &ihost->port_agent, |
2499 | iport, iphy); | 2479 | iport, iphy); |
2500 | break; | 2480 | break; |
2501 | default: | 2481 | default: |
2502 | dev_dbg(scic_to_dev(scic), | 2482 | dev_dbg(&ihost->pdev->dev, |
2503 | "%s: SCIC Controller linkup event from phy %d in " | 2483 | "%s: SCIC Controller linkup event from phy %d in " |
2504 | "unexpected state %d\n", __func__, iphy->phy_index, | 2484 | "unexpected state %d\n", __func__, iphy->phy_index, |
2505 | scic->sm.current_state_id); | 2485 | ihost->sm.current_state_id); |
2506 | } | 2486 | } |
2507 | } | 2487 | } |
2508 | 2488 | ||
2509 | void scic_sds_controller_link_down(struct scic_sds_controller *scic, | 2489 | void scic_sds_controller_link_down(struct isci_host *ihost, |
2510 | struct isci_port *iport, struct isci_phy *iphy) | 2490 | struct isci_port *iport, struct isci_phy *iphy) |
2511 | { | 2491 | { |
2512 | switch (scic->sm.current_state_id) { | 2492 | switch (ihost->sm.current_state_id) { |
2513 | case SCIC_STARTING: | 2493 | case SCIC_STARTING: |
2514 | case SCIC_READY: | 2494 | case SCIC_READY: |
2515 | scic->port_agent.link_down_handler(scic, &scic->port_agent, | 2495 | ihost->port_agent.link_down_handler(ihost, &ihost->port_agent, |
2516 | iport, iphy); | 2496 | iport, iphy); |
2517 | break; | 2497 | break; |
2518 | default: | 2498 | default: |
2519 | dev_dbg(scic_to_dev(scic), | 2499 | dev_dbg(&ihost->pdev->dev, |
2520 | "%s: SCIC Controller linkdown event from phy %d in " | 2500 | "%s: SCIC Controller linkdown event from phy %d in " |
2521 | "unexpected state %d\n", | 2501 | "unexpected state %d\n", |
2522 | __func__, | 2502 | __func__, |
2523 | iphy->phy_index, | 2503 | iphy->phy_index, |
2524 | scic->sm.current_state_id); | 2504 | ihost->sm.current_state_id); |
2525 | } | 2505 | } |
2526 | } | 2506 | } |
2527 | 2507 | ||
@@ -2530,14 +2510,13 @@ void scic_sds_controller_link_down(struct scic_sds_controller *scic, | |||
2530 | * controller are still in the stopping state. | 2510 | * controller are still in the stopping state. |
2531 | * | 2511 | * |
2532 | */ | 2512 | */ |
2533 | static bool scic_sds_controller_has_remote_devices_stopping( | 2513 | static bool scic_sds_controller_has_remote_devices_stopping(struct isci_host *ihost) |
2534 | struct scic_sds_controller *controller) | ||
2535 | { | 2514 | { |
2536 | u32 index; | 2515 | u32 index; |
2537 | 2516 | ||
2538 | for (index = 0; index < controller->remote_node_entries; index++) { | 2517 | for (index = 0; index < ihost->remote_node_entries; index++) { |
2539 | if ((controller->device_table[index] != NULL) && | 2518 | if ((ihost->device_table[index] != NULL) && |
2540 | (controller->device_table[index]->sm.current_state_id == SCI_DEV_STOPPING)) | 2519 | (ihost->device_table[index]->sm.current_state_id == SCI_DEV_STOPPING)) |
2541 | return true; | 2520 | return true; |
2542 | } | 2521 | } |
2543 | 2522 | ||
@@ -2548,20 +2527,20 @@ static bool scic_sds_controller_has_remote_devices_stopping( | |||
2548 | * This method is called by the remote device to inform the controller | 2527 | * This method is called by the remote device to inform the controller |
2549 | * object that the remote device has stopped. | 2528 | * object that the remote device has stopped. |
2550 | */ | 2529 | */ |
2551 | void scic_sds_controller_remote_device_stopped(struct scic_sds_controller *scic, | 2530 | void scic_sds_controller_remote_device_stopped(struct isci_host *ihost, |
2552 | struct isci_remote_device *idev) | 2531 | struct isci_remote_device *idev) |
2553 | { | 2532 | { |
2554 | if (scic->sm.current_state_id != SCIC_STOPPING) { | 2533 | if (ihost->sm.current_state_id != SCIC_STOPPING) { |
2555 | dev_dbg(scic_to_dev(scic), | 2534 | dev_dbg(&ihost->pdev->dev, |
2556 | "SCIC Controller 0x%p remote device stopped event " | 2535 | "SCIC Controller 0x%p remote device stopped event " |
2557 | "from device 0x%p in unexpected state %d\n", | 2536 | "from device 0x%p in unexpected state %d\n", |
2558 | scic, idev, | 2537 | ihost, idev, |
2559 | scic->sm.current_state_id); | 2538 | ihost->sm.current_state_id); |
2560 | return; | 2539 | return; |
2561 | } | 2540 | } |
2562 | 2541 | ||
2563 | if (!scic_sds_controller_has_remote_devices_stopping(scic)) { | 2542 | if (!scic_sds_controller_has_remote_devices_stopping(ihost)) { |
2564 | sci_change_state(&scic->sm, SCIC_STOPPED); | 2543 | sci_change_state(&ihost->sm, SCIC_STOPPED); |
2565 | } | 2544 | } |
2566 | } | 2545 | } |
2567 | 2546 | ||
@@ -2573,32 +2552,32 @@ void scic_sds_controller_remote_device_stopped(struct scic_sds_controller *scic, | |||
2573 | * | 2552 | * |
2574 | */ | 2553 | */ |
2575 | void scic_sds_controller_post_request( | 2554 | void scic_sds_controller_post_request( |
2576 | struct scic_sds_controller *scic, | 2555 | struct isci_host *ihost, |
2577 | u32 request) | 2556 | u32 request) |
2578 | { | 2557 | { |
2579 | dev_dbg(scic_to_dev(scic), | 2558 | dev_dbg(&ihost->pdev->dev, |
2580 | "%s: SCIC Controller 0x%p post request 0x%08x\n", | 2559 | "%s: SCIC Controller 0x%p post request 0x%08x\n", |
2581 | __func__, | 2560 | __func__, |
2582 | scic, | 2561 | ihost, |
2583 | request); | 2562 | request); |
2584 | 2563 | ||
2585 | writel(request, &scic->smu_registers->post_context_port); | 2564 | writel(request, &ihost->smu_registers->post_context_port); |
2586 | } | 2565 | } |
2587 | 2566 | ||
2588 | struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic, u16 io_tag) | 2567 | struct isci_request *scic_request_by_tag(struct isci_host *ihost, u16 io_tag) |
2589 | { | 2568 | { |
2590 | u16 task_index; | 2569 | u16 task_index; |
2591 | u16 task_sequence; | 2570 | u16 task_sequence; |
2592 | 2571 | ||
2593 | task_index = ISCI_TAG_TCI(io_tag); | 2572 | task_index = ISCI_TAG_TCI(io_tag); |
2594 | 2573 | ||
2595 | if (task_index < scic->task_context_entries) { | 2574 | if (task_index < ihost->task_context_entries) { |
2596 | struct isci_request *ireq = scic_to_ihost(scic)->reqs[task_index]; | 2575 | struct isci_request *ireq = ihost->reqs[task_index]; |
2597 | 2576 | ||
2598 | if (test_bit(IREQ_ACTIVE, &ireq->flags)) { | 2577 | if (test_bit(IREQ_ACTIVE, &ireq->flags)) { |
2599 | task_sequence = ISCI_TAG_SEQ(io_tag); | 2578 | task_sequence = ISCI_TAG_SEQ(io_tag); |
2600 | 2579 | ||
2601 | if (task_sequence == scic->io_request_sequence[task_index]) | 2580 | if (task_sequence == ihost->io_request_sequence[task_index]) |
2602 | return ireq; | 2581 | return ireq; |
2603 | } | 2582 | } |
2604 | } | 2583 | } |
@@ -2621,7 +2600,7 @@ struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic, u16 i | |||
2621 | * node index available. | 2600 | * node index available. |
2622 | */ | 2601 | */ |
2623 | enum sci_status scic_sds_controller_allocate_remote_node_context( | 2602 | enum sci_status scic_sds_controller_allocate_remote_node_context( |
2624 | struct scic_sds_controller *scic, | 2603 | struct isci_host *ihost, |
2625 | struct isci_remote_device *idev, | 2604 | struct isci_remote_device *idev, |
2626 | u16 *node_id) | 2605 | u16 *node_id) |
2627 | { | 2606 | { |
@@ -2629,11 +2608,11 @@ enum sci_status scic_sds_controller_allocate_remote_node_context( | |||
2629 | u32 remote_node_count = scic_sds_remote_device_node_count(idev); | 2608 | u32 remote_node_count = scic_sds_remote_device_node_count(idev); |
2630 | 2609 | ||
2631 | node_index = scic_sds_remote_node_table_allocate_remote_node( | 2610 | node_index = scic_sds_remote_node_table_allocate_remote_node( |
2632 | &scic->available_remote_nodes, remote_node_count | 2611 | &ihost->available_remote_nodes, remote_node_count |
2633 | ); | 2612 | ); |
2634 | 2613 | ||
2635 | if (node_index != SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX) { | 2614 | if (node_index != SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX) { |
2636 | scic->device_table[node_index] = idev; | 2615 | ihost->device_table[node_index] = idev; |
2637 | 2616 | ||
2638 | *node_id = node_index; | 2617 | *node_id = node_index; |
2639 | 2618 | ||
@@ -2653,17 +2632,17 @@ enum sci_status scic_sds_controller_allocate_remote_node_context( | |||
2653 | * | 2632 | * |
2654 | */ | 2633 | */ |
2655 | void scic_sds_controller_free_remote_node_context( | 2634 | void scic_sds_controller_free_remote_node_context( |
2656 | struct scic_sds_controller *scic, | 2635 | struct isci_host *ihost, |
2657 | struct isci_remote_device *idev, | 2636 | struct isci_remote_device *idev, |
2658 | u16 node_id) | 2637 | u16 node_id) |
2659 | { | 2638 | { |
2660 | u32 remote_node_count = scic_sds_remote_device_node_count(idev); | 2639 | u32 remote_node_count = scic_sds_remote_device_node_count(idev); |
2661 | 2640 | ||
2662 | if (scic->device_table[node_id] == idev) { | 2641 | if (ihost->device_table[node_id] == idev) { |
2663 | scic->device_table[node_id] = NULL; | 2642 | ihost->device_table[node_id] = NULL; |
2664 | 2643 | ||
2665 | scic_sds_remote_node_table_release_remote_node_index( | 2644 | scic_sds_remote_node_table_release_remote_node_index( |
2666 | &scic->available_remote_nodes, remote_node_count, node_id | 2645 | &ihost->available_remote_nodes, remote_node_count, node_id |
2667 | ); | 2646 | ); |
2668 | } | 2647 | } |
2669 | } | 2648 | } |
@@ -2677,14 +2656,14 @@ void scic_sds_controller_free_remote_node_context( | |||
2677 | * union scu_remote_node_context* | 2656 | * union scu_remote_node_context* |
2678 | */ | 2657 | */ |
2679 | union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer( | 2658 | union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer( |
2680 | struct scic_sds_controller *scic, | 2659 | struct isci_host *ihost, |
2681 | u16 node_id | 2660 | u16 node_id |
2682 | ) { | 2661 | ) { |
2683 | if ( | 2662 | if ( |
2684 | (node_id < scic->remote_node_entries) | 2663 | (node_id < ihost->remote_node_entries) |
2685 | && (scic->device_table[node_id] != NULL) | 2664 | && (ihost->device_table[node_id] != NULL) |
2686 | ) { | 2665 | ) { |
2687 | return &scic->remote_node_context_table[node_id]; | 2666 | return &ihost->remote_node_context_table[node_id]; |
2688 | } | 2667 | } |
2689 | 2668 | ||
2690 | return NULL; | 2669 | return NULL; |
@@ -2722,13 +2701,13 @@ void scic_sds_controller_copy_sata_response( | |||
2722 | * | 2701 | * |
2723 | */ | 2702 | */ |
2724 | void scic_sds_controller_release_frame( | 2703 | void scic_sds_controller_release_frame( |
2725 | struct scic_sds_controller *scic, | 2704 | struct isci_host *ihost, |
2726 | u32 frame_index) | 2705 | u32 frame_index) |
2727 | { | 2706 | { |
2728 | if (scic_sds_unsolicited_frame_control_release_frame( | 2707 | if (scic_sds_unsolicited_frame_control_release_frame( |
2729 | &scic->uf_control, frame_index) == true) | 2708 | &ihost->uf_control, frame_index) == true) |
2730 | writel(scic->uf_control.get, | 2709 | writel(ihost->uf_control.get, |
2731 | &scic->scu_registers->sdma.unsolicited_frame_get_pointer); | 2710 | &ihost->scu_registers->sdma.unsolicited_frame_get_pointer); |
2732 | } | 2711 | } |
2733 | 2712 | ||
2734 | void isci_tci_free(struct isci_host *ihost, u16 tci) | 2713 | void isci_tci_free(struct isci_host *ihost, u16 tci) |
@@ -2757,7 +2736,7 @@ u16 isci_alloc_tag(struct isci_host *ihost) | |||
2757 | { | 2736 | { |
2758 | if (isci_tci_space(ihost)) { | 2737 | if (isci_tci_space(ihost)) { |
2759 | u16 tci = isci_tci_alloc(ihost); | 2738 | u16 tci = isci_tci_alloc(ihost); |
2760 | u8 seq = ihost->sci.io_request_sequence[tci]; | 2739 | u8 seq = ihost->io_request_sequence[tci]; |
2761 | 2740 | ||
2762 | return ISCI_TAG(seq, tci); | 2741 | return ISCI_TAG(seq, tci); |
2763 | } | 2742 | } |
@@ -2767,7 +2746,6 @@ u16 isci_alloc_tag(struct isci_host *ihost) | |||
2767 | 2746 | ||
2768 | enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag) | 2747 | enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag) |
2769 | { | 2748 | { |
2770 | struct scic_sds_controller *scic = &ihost->sci; | ||
2771 | u16 tci = ISCI_TAG_TCI(io_tag); | 2749 | u16 tci = ISCI_TAG_TCI(io_tag); |
2772 | u16 seq = ISCI_TAG_SEQ(io_tag); | 2750 | u16 seq = ISCI_TAG_SEQ(io_tag); |
2773 | 2751 | ||
@@ -2775,8 +2753,8 @@ enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag) | |||
2775 | if (isci_tci_active(ihost) == 0) | 2753 | if (isci_tci_active(ihost) == 0) |
2776 | return SCI_FAILURE_INVALID_IO_TAG; | 2754 | return SCI_FAILURE_INVALID_IO_TAG; |
2777 | 2755 | ||
2778 | if (seq == scic->io_request_sequence[tci]) { | 2756 | if (seq == ihost->io_request_sequence[tci]) { |
2779 | scic->io_request_sequence[tci] = (seq+1) & (SCI_MAX_SEQ-1); | 2757 | ihost->io_request_sequence[tci] = (seq+1) & (SCI_MAX_SEQ-1); |
2780 | 2758 | ||
2781 | isci_tci_free(ihost, tci); | 2759 | isci_tci_free(ihost, tci); |
2782 | 2760 | ||
@@ -2797,23 +2775,23 @@ enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag) | |||
2797 | * @io_tag: This parameter specifies a previously allocated IO tag that the | 2775 | * @io_tag: This parameter specifies a previously allocated IO tag that the |
2798 | * user desires to be utilized for this request. | 2776 | * user desires to be utilized for this request. |
2799 | */ | 2777 | */ |
2800 | enum sci_status scic_controller_start_io(struct scic_sds_controller *scic, | 2778 | enum sci_status scic_controller_start_io(struct isci_host *ihost, |
2801 | struct isci_remote_device *idev, | 2779 | struct isci_remote_device *idev, |
2802 | struct isci_request *ireq) | 2780 | struct isci_request *ireq) |
2803 | { | 2781 | { |
2804 | enum sci_status status; | 2782 | enum sci_status status; |
2805 | 2783 | ||
2806 | if (scic->sm.current_state_id != SCIC_READY) { | 2784 | if (ihost->sm.current_state_id != SCIC_READY) { |
2807 | dev_warn(scic_to_dev(scic), "invalid state to start I/O"); | 2785 | dev_warn(&ihost->pdev->dev, "invalid state to start I/O"); |
2808 | return SCI_FAILURE_INVALID_STATE; | 2786 | return SCI_FAILURE_INVALID_STATE; |
2809 | } | 2787 | } |
2810 | 2788 | ||
2811 | status = scic_sds_remote_device_start_io(scic, idev, ireq); | 2789 | status = scic_sds_remote_device_start_io(ihost, idev, ireq); |
2812 | if (status != SCI_SUCCESS) | 2790 | if (status != SCI_SUCCESS) |
2813 | return status; | 2791 | return status; |
2814 | 2792 | ||
2815 | set_bit(IREQ_ACTIVE, &ireq->flags); | 2793 | set_bit(IREQ_ACTIVE, &ireq->flags); |
2816 | scic_sds_controller_post_request(scic, scic_sds_request_get_post_context(ireq)); | 2794 | scic_sds_controller_post_request(ihost, scic_sds_request_get_post_context(ireq)); |
2817 | return SCI_SUCCESS; | 2795 | return SCI_SUCCESS; |
2818 | } | 2796 | } |
2819 | 2797 | ||
@@ -2834,14 +2812,14 @@ enum sci_status scic_controller_start_io(struct scic_sds_controller *scic, | |||
2834 | * for the request. Determine the failure situations and return values. | 2812 | * for the request. Determine the failure situations and return values. |
2835 | */ | 2813 | */ |
2836 | enum sci_status scic_controller_terminate_request( | 2814 | enum sci_status scic_controller_terminate_request( |
2837 | struct scic_sds_controller *scic, | 2815 | struct isci_host *ihost, |
2838 | struct isci_remote_device *idev, | 2816 | struct isci_remote_device *idev, |
2839 | struct isci_request *ireq) | 2817 | struct isci_request *ireq) |
2840 | { | 2818 | { |
2841 | enum sci_status status; | 2819 | enum sci_status status; |
2842 | 2820 | ||
2843 | if (scic->sm.current_state_id != SCIC_READY) { | 2821 | if (ihost->sm.current_state_id != SCIC_READY) { |
2844 | dev_warn(scic_to_dev(scic), | 2822 | dev_warn(&ihost->pdev->dev, |
2845 | "invalid state to terminate request\n"); | 2823 | "invalid state to terminate request\n"); |
2846 | return SCI_FAILURE_INVALID_STATE; | 2824 | return SCI_FAILURE_INVALID_STATE; |
2847 | } | 2825 | } |
@@ -2854,7 +2832,7 @@ enum sci_status scic_controller_terminate_request( | |||
2854 | * Utilize the original post context command and or in the POST_TC_ABORT | 2832 | * Utilize the original post context command and or in the POST_TC_ABORT |
2855 | * request sub-type. | 2833 | * request sub-type. |
2856 | */ | 2834 | */ |
2857 | scic_sds_controller_post_request(scic, | 2835 | scic_sds_controller_post_request(ihost, |
2858 | scic_sds_request_get_post_context(ireq) | | 2836 | scic_sds_request_get_post_context(ireq) | |
2859 | SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT); | 2837 | SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT); |
2860 | return SCI_SUCCESS; | 2838 | return SCI_SUCCESS; |
@@ -2872,19 +2850,19 @@ enum sci_status scic_controller_terminate_request( | |||
2872 | * @io_request: the handle to the io request object to complete. | 2850 | * @io_request: the handle to the io request object to complete. |
2873 | */ | 2851 | */ |
2874 | enum sci_status scic_controller_complete_io( | 2852 | enum sci_status scic_controller_complete_io( |
2875 | struct scic_sds_controller *scic, | 2853 | struct isci_host *ihost, |
2876 | struct isci_remote_device *idev, | 2854 | struct isci_remote_device *idev, |
2877 | struct isci_request *ireq) | 2855 | struct isci_request *ireq) |
2878 | { | 2856 | { |
2879 | enum sci_status status; | 2857 | enum sci_status status; |
2880 | u16 index; | 2858 | u16 index; |
2881 | 2859 | ||
2882 | switch (scic->sm.current_state_id) { | 2860 | switch (ihost->sm.current_state_id) { |
2883 | case SCIC_STOPPING: | 2861 | case SCIC_STOPPING: |
2884 | /* XXX: Implement this function */ | 2862 | /* XXX: Implement this function */ |
2885 | return SCI_FAILURE; | 2863 | return SCI_FAILURE; |
2886 | case SCIC_READY: | 2864 | case SCIC_READY: |
2887 | status = scic_sds_remote_device_complete_io(scic, idev, ireq); | 2865 | status = scic_sds_remote_device_complete_io(ihost, idev, ireq); |
2888 | if (status != SCI_SUCCESS) | 2866 | if (status != SCI_SUCCESS) |
2889 | return status; | 2867 | return status; |
2890 | 2868 | ||
@@ -2892,7 +2870,7 @@ enum sci_status scic_controller_complete_io( | |||
2892 | clear_bit(IREQ_ACTIVE, &ireq->flags); | 2870 | clear_bit(IREQ_ACTIVE, &ireq->flags); |
2893 | return SCI_SUCCESS; | 2871 | return SCI_SUCCESS; |
2894 | default: | 2872 | default: |
2895 | dev_warn(scic_to_dev(scic), "invalid state to complete I/O"); | 2873 | dev_warn(&ihost->pdev->dev, "invalid state to complete I/O"); |
2896 | return SCI_FAILURE_INVALID_STATE; | 2874 | return SCI_FAILURE_INVALID_STATE; |
2897 | } | 2875 | } |
2898 | 2876 | ||
@@ -2900,15 +2878,15 @@ enum sci_status scic_controller_complete_io( | |||
2900 | 2878 | ||
2901 | enum sci_status scic_controller_continue_io(struct isci_request *ireq) | 2879 | enum sci_status scic_controller_continue_io(struct isci_request *ireq) |
2902 | { | 2880 | { |
2903 | struct scic_sds_controller *scic = ireq->owning_controller; | 2881 | struct isci_host *ihost = ireq->owning_controller; |
2904 | 2882 | ||
2905 | if (scic->sm.current_state_id != SCIC_READY) { | 2883 | if (ihost->sm.current_state_id != SCIC_READY) { |
2906 | dev_warn(scic_to_dev(scic), "invalid state to continue I/O"); | 2884 | dev_warn(&ihost->pdev->dev, "invalid state to continue I/O"); |
2907 | return SCI_FAILURE_INVALID_STATE; | 2885 | return SCI_FAILURE_INVALID_STATE; |
2908 | } | 2886 | } |
2909 | 2887 | ||
2910 | set_bit(IREQ_ACTIVE, &ireq->flags); | 2888 | set_bit(IREQ_ACTIVE, &ireq->flags); |
2911 | scic_sds_controller_post_request(scic, scic_sds_request_get_post_context(ireq)); | 2889 | scic_sds_controller_post_request(ihost, scic_sds_request_get_post_context(ireq)); |
2912 | return SCI_SUCCESS; | 2890 | return SCI_SUCCESS; |
2913 | } | 2891 | } |
2914 | 2892 | ||
@@ -2922,21 +2900,21 @@ enum sci_status scic_controller_continue_io(struct isci_request *ireq) | |||
2922 | * @task_request: the handle to the task request object to start. | 2900 | * @task_request: the handle to the task request object to start. |
2923 | */ | 2901 | */ |
2924 | enum sci_task_status scic_controller_start_task( | 2902 | enum sci_task_status scic_controller_start_task( |
2925 | struct scic_sds_controller *scic, | 2903 | struct isci_host *ihost, |
2926 | struct isci_remote_device *idev, | 2904 | struct isci_remote_device *idev, |
2927 | struct isci_request *ireq) | 2905 | struct isci_request *ireq) |
2928 | { | 2906 | { |
2929 | enum sci_status status; | 2907 | enum sci_status status; |
2930 | 2908 | ||
2931 | if (scic->sm.current_state_id != SCIC_READY) { | 2909 | if (ihost->sm.current_state_id != SCIC_READY) { |
2932 | dev_warn(scic_to_dev(scic), | 2910 | dev_warn(&ihost->pdev->dev, |
2933 | "%s: SCIC Controller starting task from invalid " | 2911 | "%s: SCIC Controller starting task from invalid " |
2934 | "state\n", | 2912 | "state\n", |
2935 | __func__); | 2913 | __func__); |
2936 | return SCI_TASK_FAILURE_INVALID_STATE; | 2914 | return SCI_TASK_FAILURE_INVALID_STATE; |
2937 | } | 2915 | } |
2938 | 2916 | ||
2939 | status = scic_sds_remote_device_start_task(scic, idev, ireq); | 2917 | status = scic_sds_remote_device_start_task(ihost, idev, ireq); |
2940 | switch (status) { | 2918 | switch (status) { |
2941 | case SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS: | 2919 | case SCI_FAILURE_RESET_DEVICE_PARTIAL_SUCCESS: |
2942 | set_bit(IREQ_ACTIVE, &ireq->flags); | 2920 | set_bit(IREQ_ACTIVE, &ireq->flags); |
@@ -2950,7 +2928,7 @@ enum sci_task_status scic_controller_start_task( | |||
2950 | case SCI_SUCCESS: | 2928 | case SCI_SUCCESS: |
2951 | set_bit(IREQ_ACTIVE, &ireq->flags); | 2929 | set_bit(IREQ_ACTIVE, &ireq->flags); |
2952 | 2930 | ||
2953 | scic_sds_controller_post_request(scic, | 2931 | scic_sds_controller_post_request(ihost, |
2954 | scic_sds_request_get_post_context(ireq)); | 2932 | scic_sds_request_get_post_context(ireq)); |
2955 | break; | 2933 | break; |
2956 | default: | 2934 | default: |
diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h index ca2e3b0ee0dd..013f672a8fd7 100644 --- a/drivers/scsi/isci/host.h +++ b/drivers/scsi/isci/host.h | |||
@@ -106,7 +106,7 @@ struct scic_power_control { | |||
106 | }; | 106 | }; |
107 | 107 | ||
108 | struct scic_sds_port_configuration_agent; | 108 | struct scic_sds_port_configuration_agent; |
109 | typedef void (*port_config_fn)(struct scic_sds_controller *, | 109 | typedef void (*port_config_fn)(struct isci_host *, |
110 | struct scic_sds_port_configuration_agent *, | 110 | struct scic_sds_port_configuration_agent *, |
111 | struct isci_port *, struct isci_phy *); | 111 | struct isci_port *, struct isci_phy *); |
112 | 112 | ||
@@ -124,171 +124,66 @@ struct scic_sds_port_configuration_agent { | |||
124 | }; | 124 | }; |
125 | 125 | ||
126 | /** | 126 | /** |
127 | * struct scic_sds_controller - | 127 | * isci_host - primary host/controller object |
128 | * | 128 | * @timer: timeout start/stop operations |
129 | * This structure represents the SCU controller object. | 129 | * @device_table: rni (hw remote node index) to remote device lookup table |
130 | * @available_remote_nodes: rni allocator | ||
131 | * @power_control: manage device spin up | ||
132 | * @io_request_sequence: generation number for tci's (task contexts) | ||
133 | * @task_context_table: hw task context table | ||
134 | * @remote_node_context_table: hw remote node context table | ||
135 | * @completion_queue: hw-producer driver-consumer communication ring | ||
136 | * @completion_queue_get: tracks the driver 'head' of the ring to notify hw | ||
137 | * @logical_port_entries: min({driver|silicon}-supported-port-count) | ||
138 | * @remote_node_entries: min({driver|silicon}-supported-node-count) | ||
139 | * @task_context_entries: min({driver|silicon}-supported-task-count) | ||
140 | * @phy_timer: phy startup timer | ||
141 | * @invalid_phy_mask: if an invalid_link_up notification is reported a bit for | ||
142 | * the phy index is set so further notifications are not | ||
143 | * made. Once the phy reports link up and is made part of a | ||
144 | * port then this bit is cleared. | ||
145 | |||
130 | */ | 146 | */ |
131 | struct scic_sds_controller { | 147 | struct isci_host { |
132 | /** | ||
133 | * This field contains the information for the base controller state | ||
134 | * machine. | ||
135 | */ | ||
136 | struct sci_base_state_machine sm; | 148 | struct sci_base_state_machine sm; |
137 | 149 | /* XXX can we time this externally */ | |
138 | /** | ||
139 | * Timer for controller start/stop operations. | ||
140 | */ | ||
141 | struct sci_timer timer; | 150 | struct sci_timer timer; |
142 | 151 | /* XXX drop reference module params directly */ | |
143 | /** | ||
144 | * This field contains the user parameters to be utilized for this | ||
145 | * core controller object. | ||
146 | */ | ||
147 | union scic_user_parameters user_parameters; | 152 | union scic_user_parameters user_parameters; |
148 | 153 | /* XXX no need to be a union */ | |
149 | /** | ||
150 | * This field contains the OEM parameters to be utilized for this | ||
151 | * core controller object. | ||
152 | */ | ||
153 | union scic_oem_parameters oem_parameters; | 154 | union scic_oem_parameters oem_parameters; |
154 | |||
155 | /** | ||
156 | * This field contains the port configuration agent for this controller. | ||
157 | */ | ||
158 | struct scic_sds_port_configuration_agent port_agent; | 155 | struct scic_sds_port_configuration_agent port_agent; |
159 | |||
160 | /** | ||
161 | * This field is the array of device objects that are currently constructed | ||
162 | * for this controller object. This table is used as a fast lookup of device | ||
163 | * objects that need to handle device completion notifications from the | ||
164 | * hardware. The table is RNi based. | ||
165 | */ | ||
166 | struct isci_remote_device *device_table[SCI_MAX_REMOTE_DEVICES]; | 156 | struct isci_remote_device *device_table[SCI_MAX_REMOTE_DEVICES]; |
167 | |||
168 | /** | ||
169 | * This field is the free RNi data structure | ||
170 | */ | ||
171 | struct scic_remote_node_table available_remote_nodes; | 157 | struct scic_remote_node_table available_remote_nodes; |
172 | |||
173 | /** | ||
174 | * This filed is the struct scic_power_control data used to controll when direct | ||
175 | * attached devices can consume power. | ||
176 | */ | ||
177 | struct scic_power_control power_control; | 158 | struct scic_power_control power_control; |
178 | |||
179 | /* sequence number per tci */ | ||
180 | u8 io_request_sequence[SCI_MAX_IO_REQUESTS]; | 159 | u8 io_request_sequence[SCI_MAX_IO_REQUESTS]; |
181 | |||
182 | /** | ||
183 | * This field is a pointer to the memory allocated by the driver for the task | ||
184 | * context table. This data is shared between the hardware and software. | ||
185 | */ | ||
186 | struct scu_task_context *task_context_table; | 160 | struct scu_task_context *task_context_table; |
187 | dma_addr_t task_context_dma; | 161 | dma_addr_t task_context_dma; |
188 | |||
189 | /** | ||
190 | * This field is a pointer to the memory allocated by the driver for the | ||
191 | * remote node context table. This table is shared between the hardware and | ||
192 | * software. | ||
193 | */ | ||
194 | union scu_remote_node_context *remote_node_context_table; | 162 | union scu_remote_node_context *remote_node_context_table; |
195 | |||
196 | /** | ||
197 | * This field is a pointer to the completion queue. This memory is | ||
198 | * written to by the hardware and read by the software. | ||
199 | */ | ||
200 | u32 *completion_queue; | 163 | u32 *completion_queue; |
201 | |||
202 | /** | ||
203 | * This field is the software copy of the completion queue get pointer. The | ||
204 | * controller object writes this value to the hardware after processing the | ||
205 | * completion entries. | ||
206 | */ | ||
207 | u32 completion_queue_get; | 164 | u32 completion_queue_get; |
208 | |||
209 | /** | ||
210 | * This field is the minimum of the number of hardware supported port entries | ||
211 | * and the software requested port entries. | ||
212 | */ | ||
213 | u32 logical_port_entries; | 165 | u32 logical_port_entries; |
214 | |||
215 | /** | ||
216 | * This field is the minimum number of devices supported by the hardware and | ||
217 | * the number of devices requested by the software. | ||
218 | */ | ||
219 | u32 remote_node_entries; | 166 | u32 remote_node_entries; |
220 | |||
221 | /** | ||
222 | * This field is the minimum number of IO requests supported by the hardware | ||
223 | * and the number of IO requests requested by the software. | ||
224 | */ | ||
225 | u32 task_context_entries; | 167 | u32 task_context_entries; |
226 | |||
227 | /** | ||
228 | * This object contains all of the unsolicited frame specific | ||
229 | * data utilized by the core controller. | ||
230 | */ | ||
231 | struct scic_sds_unsolicited_frame_control uf_control; | 168 | struct scic_sds_unsolicited_frame_control uf_control; |
232 | 169 | ||
233 | /* Phy Startup Data */ | 170 | /* phy startup */ |
234 | /** | ||
235 | * Timer for controller phy request startup. On controller start the | ||
236 | * controller will start each PHY individually in order of phy index. | ||
237 | */ | ||
238 | struct sci_timer phy_timer; | 171 | struct sci_timer phy_timer; |
239 | 172 | /* XXX kill */ | |
240 | /** | ||
241 | * This field is set when the phy_timer is running and is cleared when | ||
242 | * the phy_timer is stopped. | ||
243 | */ | ||
244 | bool phy_startup_timer_pending; | 173 | bool phy_startup_timer_pending; |
245 | |||
246 | /** | ||
247 | * This field is the index of the next phy start. It is initialized to 0 and | ||
248 | * increments for each phy index that is started. | ||
249 | */ | ||
250 | u32 next_phy_to_start; | 174 | u32 next_phy_to_start; |
251 | |||
252 | /** | ||
253 | * This field controlls the invalid link up notifications to the SCI_USER. If | ||
254 | * an invalid_link_up notification is reported a bit for the PHY index is set | ||
255 | * so further notifications are not made. Once the PHY object reports link up | ||
256 | * and is made part of a port then this bit for the PHY index is cleared. | ||
257 | */ | ||
258 | u8 invalid_phy_mask; | 175 | u8 invalid_phy_mask; |
259 | 176 | ||
260 | /* | 177 | /* TODO attempt dynamic interrupt coalescing scheme */ |
261 | * This field saves the current interrupt coalescing number of the controller. | ||
262 | */ | ||
263 | u16 interrupt_coalesce_number; | 178 | u16 interrupt_coalesce_number; |
264 | |||
265 | /* | ||
266 | * This field saves the current interrupt coalescing timeout value in microseconds. | ||
267 | */ | ||
268 | u32 interrupt_coalesce_timeout; | 179 | u32 interrupt_coalesce_timeout; |
269 | |||
270 | /** | ||
271 | * This field is a pointer to the memory mapped register space for the | ||
272 | * struct smu_registers. | ||
273 | */ | ||
274 | struct smu_registers __iomem *smu_registers; | 180 | struct smu_registers __iomem *smu_registers; |
275 | |||
276 | /** | ||
277 | * This field is a pointer to the memory mapped register space for the | ||
278 | * struct scu_registers. | ||
279 | */ | ||
280 | struct scu_registers __iomem *scu_registers; | 181 | struct scu_registers __iomem *scu_registers; |
281 | 182 | ||
282 | }; | ||
283 | |||
284 | struct isci_host { | ||
285 | struct scic_sds_controller sci; | ||
286 | u16 tci_head; | 183 | u16 tci_head; |
287 | u16 tci_tail; | 184 | u16 tci_tail; |
288 | u16 tci_pool[SCI_MAX_IO_REQUESTS]; | 185 | u16 tci_pool[SCI_MAX_IO_REQUESTS]; |
289 | 186 | ||
290 | union scic_oem_parameters oem_parameters; | ||
291 | |||
292 | int id; /* unique within a given pci device */ | 187 | int id; /* unique within a given pci device */ |
293 | struct isci_phy phys[SCI_MAX_PHYS]; | 188 | struct isci_phy phys[SCI_MAX_PHYS]; |
294 | struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */ | 189 | struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */ |
@@ -464,14 +359,6 @@ static inline struct isci_host *dev_to_ihost(struct domain_device *dev) | |||
464 | return dev->port->ha->lldd_ha; | 359 | return dev->port->ha->lldd_ha; |
465 | } | 360 | } |
466 | 361 | ||
467 | static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic) | ||
468 | { | ||
469 | /* XXX delete after merging scic_sds_contoller and isci_host */ | ||
470 | struct isci_host *ihost = container_of(scic, typeof(*ihost), sci); | ||
471 | |||
472 | return ihost; | ||
473 | } | ||
474 | |||
475 | /** | 362 | /** |
476 | * scic_sds_controller_get_protocol_engine_group() - | 363 | * scic_sds_controller_get_protocol_engine_group() - |
477 | * | 364 | * |
@@ -518,11 +405,6 @@ static inline int scic_sds_remote_device_node_count(struct isci_remote_device *i | |||
518 | #define scic_sds_controller_clear_invalid_phy(controller, phy) \ | 405 | #define scic_sds_controller_clear_invalid_phy(controller, phy) \ |
519 | ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index)) | 406 | ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index)) |
520 | 407 | ||
521 | static inline struct device *scic_to_dev(struct scic_sds_controller *scic) | ||
522 | { | ||
523 | return &scic_to_ihost(scic)->pdev->dev; | ||
524 | } | ||
525 | |||
526 | static inline struct device *sciphy_to_dev(struct isci_phy *iphy) | 408 | static inline struct device *sciphy_to_dev(struct isci_phy *iphy) |
527 | { | 409 | { |
528 | 410 | ||
@@ -578,54 +460,54 @@ static inline bool is_c0(void) | |||
578 | return isci_si_rev > ISCI_SI_REVB0; | 460 | return isci_si_rev > ISCI_SI_REVB0; |
579 | } | 461 | } |
580 | 462 | ||
581 | void scic_sds_controller_post_request(struct scic_sds_controller *scic, | 463 | void scic_sds_controller_post_request(struct isci_host *ihost, |
582 | u32 request); | 464 | u32 request); |
583 | void scic_sds_controller_release_frame(struct scic_sds_controller *scic, | 465 | void scic_sds_controller_release_frame(struct isci_host *ihost, |
584 | u32 frame_index); | 466 | u32 frame_index); |
585 | void scic_sds_controller_copy_sata_response(void *response_buffer, | 467 | void scic_sds_controller_copy_sata_response(void *response_buffer, |
586 | void *frame_header, | 468 | void *frame_header, |
587 | void *frame_buffer); | 469 | void *frame_buffer); |
588 | enum sci_status scic_sds_controller_allocate_remote_node_context(struct scic_sds_controller *scic, | 470 | enum sci_status scic_sds_controller_allocate_remote_node_context(struct isci_host *ihost, |
589 | struct isci_remote_device *idev, | 471 | struct isci_remote_device *idev, |
590 | u16 *node_id); | 472 | u16 *node_id); |
591 | void scic_sds_controller_free_remote_node_context( | 473 | void scic_sds_controller_free_remote_node_context( |
592 | struct scic_sds_controller *scic, | 474 | struct isci_host *ihost, |
593 | struct isci_remote_device *idev, | 475 | struct isci_remote_device *idev, |
594 | u16 node_id); | 476 | u16 node_id); |
595 | union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer( | 477 | union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer( |
596 | struct scic_sds_controller *scic, | 478 | struct isci_host *ihost, |
597 | u16 node_id); | 479 | u16 node_id); |
598 | 480 | ||
599 | struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic, | 481 | struct isci_request *scic_request_by_tag(struct isci_host *ihost, |
600 | u16 io_tag); | 482 | u16 io_tag); |
601 | 483 | ||
602 | void scic_sds_controller_power_control_queue_insert( | 484 | void scic_sds_controller_power_control_queue_insert( |
603 | struct scic_sds_controller *scic, | 485 | struct isci_host *ihost, |
604 | struct isci_phy *iphy); | 486 | struct isci_phy *iphy); |
605 | 487 | ||
606 | void scic_sds_controller_power_control_queue_remove( | 488 | void scic_sds_controller_power_control_queue_remove( |
607 | struct scic_sds_controller *scic, | 489 | struct isci_host *ihost, |
608 | struct isci_phy *iphy); | 490 | struct isci_phy *iphy); |
609 | 491 | ||
610 | void scic_sds_controller_link_up( | 492 | void scic_sds_controller_link_up( |
611 | struct scic_sds_controller *scic, | 493 | struct isci_host *ihost, |
612 | struct isci_port *iport, | 494 | struct isci_port *iport, |
613 | struct isci_phy *iphy); | 495 | struct isci_phy *iphy); |
614 | 496 | ||
615 | void scic_sds_controller_link_down( | 497 | void scic_sds_controller_link_down( |
616 | struct scic_sds_controller *scic, | 498 | struct isci_host *ihost, |
617 | struct isci_port *iport, | 499 | struct isci_port *iport, |
618 | struct isci_phy *iphy); | 500 | struct isci_phy *iphy); |
619 | 501 | ||
620 | void scic_sds_controller_remote_device_stopped( | 502 | void scic_sds_controller_remote_device_stopped( |
621 | struct scic_sds_controller *scic, | 503 | struct isci_host *ihost, |
622 | struct isci_remote_device *idev); | 504 | struct isci_remote_device *idev); |
623 | 505 | ||
624 | void scic_sds_controller_copy_task_context( | 506 | void scic_sds_controller_copy_task_context( |
625 | struct scic_sds_controller *scic, | 507 | struct isci_host *ihost, |
626 | struct isci_request *ireq); | 508 | struct isci_request *ireq); |
627 | 509 | ||
628 | void scic_sds_controller_register_setup(struct scic_sds_controller *scic); | 510 | void scic_sds_controller_register_setup(struct isci_host *ihost); |
629 | 511 | ||
630 | enum sci_status scic_controller_continue_io(struct isci_request *ireq); | 512 | enum sci_status scic_controller_continue_io(struct isci_request *ireq); |
631 | int isci_host_scan_finished(struct Scsi_Host *, unsigned long); | 513 | int isci_host_scan_finished(struct Scsi_Host *, unsigned long); |
@@ -655,25 +537,25 @@ void isci_host_remote_device_start_complete( | |||
655 | enum sci_status); | 537 | enum sci_status); |
656 | 538 | ||
657 | void scic_controller_disable_interrupts( | 539 | void scic_controller_disable_interrupts( |
658 | struct scic_sds_controller *scic); | 540 | struct isci_host *ihost); |
659 | 541 | ||
660 | enum sci_status scic_controller_start_io( | 542 | enum sci_status scic_controller_start_io( |
661 | struct scic_sds_controller *scic, | 543 | struct isci_host *ihost, |
662 | struct isci_remote_device *idev, | 544 | struct isci_remote_device *idev, |
663 | struct isci_request *ireq); | 545 | struct isci_request *ireq); |
664 | 546 | ||
665 | enum sci_task_status scic_controller_start_task( | 547 | enum sci_task_status scic_controller_start_task( |
666 | struct scic_sds_controller *scic, | 548 | struct isci_host *ihost, |
667 | struct isci_remote_device *idev, | 549 | struct isci_remote_device *idev, |
668 | struct isci_request *ireq); | 550 | struct isci_request *ireq); |
669 | 551 | ||
670 | enum sci_status scic_controller_terminate_request( | 552 | enum sci_status scic_controller_terminate_request( |
671 | struct scic_sds_controller *scic, | 553 | struct isci_host *ihost, |
672 | struct isci_remote_device *idev, | 554 | struct isci_remote_device *idev, |
673 | struct isci_request *ireq); | 555 | struct isci_request *ireq); |
674 | 556 | ||
675 | enum sci_status scic_controller_complete_io( | 557 | enum sci_status scic_controller_complete_io( |
676 | struct scic_sds_controller *scic, | 558 | struct isci_host *ihost, |
677 | struct isci_remote_device *idev, | 559 | struct isci_remote_device *idev, |
678 | struct isci_request *ireq); | 560 | struct isci_request *ireq); |
679 | 561 | ||
@@ -681,6 +563,6 @@ void scic_sds_port_configuration_agent_construct( | |||
681 | struct scic_sds_port_configuration_agent *port_agent); | 563 | struct scic_sds_port_configuration_agent *port_agent); |
682 | 564 | ||
683 | enum sci_status scic_sds_port_configuration_agent_initialize( | 565 | enum sci_status scic_sds_port_configuration_agent_initialize( |
684 | struct scic_sds_controller *controller, | 566 | struct isci_host *ihost, |
685 | struct scic_sds_port_configuration_agent *port_agent); | 567 | struct scic_sds_port_configuration_agent *port_agent); |
686 | #endif | 568 | #endif |
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c index bbfb6e563207..68ca1a4f30af 100644 --- a/drivers/scsi/isci/init.c +++ b/drivers/scsi/isci/init.c | |||
@@ -548,13 +548,13 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic | |||
548 | 548 | ||
549 | static void __devexit isci_pci_remove(struct pci_dev *pdev) | 549 | static void __devexit isci_pci_remove(struct pci_dev *pdev) |
550 | { | 550 | { |
551 | struct isci_host *isci_host; | 551 | struct isci_host *ihost; |
552 | int i; | 552 | int i; |
553 | 553 | ||
554 | for_each_isci_host(i, isci_host, pdev) { | 554 | for_each_isci_host(i, ihost, pdev) { |
555 | isci_unregister(isci_host); | 555 | isci_unregister(ihost); |
556 | isci_host_deinit(isci_host); | 556 | isci_host_deinit(ihost); |
557 | scic_controller_disable_interrupts(&isci_host->sci); | 557 | scic_controller_disable_interrupts(ihost); |
558 | } | 558 | } |
559 | } | 559 | } |
560 | 560 | ||
diff --git a/drivers/scsi/isci/phy.c b/drivers/scsi/isci/phy.c index fd0e9734e5d0..ca96b5ad0d52 100644 --- a/drivers/scsi/isci/phy.c +++ b/drivers/scsi/isci/phy.c | |||
@@ -112,13 +112,13 @@ static enum sci_status | |||
112 | scic_sds_phy_link_layer_initialization(struct isci_phy *iphy, | 112 | scic_sds_phy_link_layer_initialization(struct isci_phy *iphy, |
113 | struct scu_link_layer_registers __iomem *link_layer_registers) | 113 | struct scu_link_layer_registers __iomem *link_layer_registers) |
114 | { | 114 | { |
115 | struct scic_sds_controller *scic = | 115 | struct isci_host *ihost = |
116 | iphy->owning_port->owning_controller; | 116 | iphy->owning_port->owning_controller; |
117 | int phy_idx = iphy->phy_index; | 117 | int phy_idx = iphy->phy_index; |
118 | struct sci_phy_user_params *phy_user = | 118 | struct sci_phy_user_params *phy_user = |
119 | &scic->user_parameters.sds1.phys[phy_idx]; | 119 | &ihost->user_parameters.sds1.phys[phy_idx]; |
120 | struct sci_phy_oem_params *phy_oem = | 120 | struct sci_phy_oem_params *phy_oem = |
121 | &scic->oem_parameters.sds1.phys[phy_idx]; | 121 | &ihost->oem_parameters.sds1.phys[phy_idx]; |
122 | u32 phy_configuration; | 122 | u32 phy_configuration; |
123 | struct scic_phy_cap phy_cap; | 123 | struct scic_phy_cap phy_cap; |
124 | u32 parity_check = 0; | 124 | u32 parity_check = 0; |
@@ -169,7 +169,7 @@ scic_sds_phy_link_layer_initialization(struct isci_phy *iphy, | |||
169 | phy_cap.gen3_no_ssc = 1; | 169 | phy_cap.gen3_no_ssc = 1; |
170 | phy_cap.gen2_no_ssc = 1; | 170 | phy_cap.gen2_no_ssc = 1; |
171 | phy_cap.gen1_no_ssc = 1; | 171 | phy_cap.gen1_no_ssc = 1; |
172 | if (scic->oem_parameters.sds1.controller.do_enable_ssc == true) { | 172 | if (ihost->oem_parameters.sds1.controller.do_enable_ssc == true) { |
173 | phy_cap.gen3_ssc = 1; | 173 | phy_cap.gen3_ssc = 1; |
174 | phy_cap.gen2_ssc = 1; | 174 | phy_cap.gen2_ssc = 1; |
175 | phy_cap.gen1_ssc = 1; | 175 | phy_cap.gen1_ssc = 1; |
@@ -216,7 +216,7 @@ scic_sds_phy_link_layer_initialization(struct isci_phy *iphy, | |||
216 | &iphy->link_layer_registers->afe_lookup_table_control); | 216 | &iphy->link_layer_registers->afe_lookup_table_control); |
217 | 217 | ||
218 | llctl = SCU_SAS_LLCTL_GEN_VAL(NO_OUTBOUND_TASK_TIMEOUT, | 218 | llctl = SCU_SAS_LLCTL_GEN_VAL(NO_OUTBOUND_TASK_TIMEOUT, |
219 | (u8)scic->user_parameters.sds1.no_outbound_task_timeout); | 219 | (u8)ihost->user_parameters.sds1.no_outbound_task_timeout); |
220 | 220 | ||
221 | switch(phy_user->max_speed_generation) { | 221 | switch(phy_user->max_speed_generation) { |
222 | case SCIC_SDS_PARM_GEN3_SPEED: | 222 | case SCIC_SDS_PARM_GEN3_SPEED: |
@@ -255,7 +255,7 @@ static void phy_sata_timeout(unsigned long data) | |||
255 | { | 255 | { |
256 | struct sci_timer *tmr = (struct sci_timer *)data; | 256 | struct sci_timer *tmr = (struct sci_timer *)data; |
257 | struct isci_phy *iphy = container_of(tmr, typeof(*iphy), sata_timer); | 257 | struct isci_phy *iphy = container_of(tmr, typeof(*iphy), sata_timer); |
258 | struct isci_host *ihost = scic_to_ihost(iphy->owning_port->owning_controller); | 258 | struct isci_host *ihost = iphy->owning_port->owning_controller; |
259 | unsigned long flags; | 259 | unsigned long flags; |
260 | 260 | ||
261 | spin_lock_irqsave(&ihost->scic_lock, flags); | 261 | spin_lock_irqsave(&ihost->scic_lock, flags); |
@@ -890,7 +890,7 @@ enum sci_status scic_sds_phy_frame_handler(struct isci_phy *iphy, | |||
890 | u32 frame_index) | 890 | u32 frame_index) |
891 | { | 891 | { |
892 | enum scic_sds_phy_states state = iphy->sm.current_state_id; | 892 | enum scic_sds_phy_states state = iphy->sm.current_state_id; |
893 | struct scic_sds_controller *scic = iphy->owning_port->owning_controller; | 893 | struct isci_host *ihost = iphy->owning_port->owning_controller; |
894 | enum sci_status result; | 894 | enum sci_status result; |
895 | unsigned long flags; | 895 | unsigned long flags; |
896 | 896 | ||
@@ -899,7 +899,7 @@ enum sci_status scic_sds_phy_frame_handler(struct isci_phy *iphy, | |||
899 | u32 *frame_words; | 899 | u32 *frame_words; |
900 | struct sas_identify_frame iaf; | 900 | struct sas_identify_frame iaf; |
901 | 901 | ||
902 | result = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 902 | result = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
903 | frame_index, | 903 | frame_index, |
904 | (void **)&frame_words); | 904 | (void **)&frame_words); |
905 | 905 | ||
@@ -933,7 +933,7 @@ enum sci_status scic_sds_phy_frame_handler(struct isci_phy *iphy, | |||
933 | "unexpected frame id %x\n", | 933 | "unexpected frame id %x\n", |
934 | __func__, frame_index); | 934 | __func__, frame_index); |
935 | 935 | ||
936 | scic_sds_controller_release_frame(scic, frame_index); | 936 | scic_sds_controller_release_frame(ihost, frame_index); |
937 | return result; | 937 | return result; |
938 | } | 938 | } |
939 | case SCI_PHY_SUB_AWAIT_SIG_FIS_UF: { | 939 | case SCI_PHY_SUB_AWAIT_SIG_FIS_UF: { |
@@ -950,7 +950,7 @@ enum sci_status scic_sds_phy_frame_handler(struct isci_phy *iphy, | |||
950 | 950 | ||
951 | if ((frame_header->fis_type == FIS_REGD2H) && | 951 | if ((frame_header->fis_type == FIS_REGD2H) && |
952 | !(frame_header->status & ATA_BUSY)) { | 952 | !(frame_header->status & ATA_BUSY)) { |
953 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 953 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
954 | frame_index, | 954 | frame_index, |
955 | (void **)&fis_frame_data); | 955 | (void **)&fis_frame_data); |
956 | 956 | ||
@@ -971,7 +971,7 @@ enum sci_status scic_sds_phy_frame_handler(struct isci_phy *iphy, | |||
971 | __func__, frame_index); | 971 | __func__, frame_index); |
972 | 972 | ||
973 | /* Regardless of the result we are done with this frame with it */ | 973 | /* Regardless of the result we are done with this frame with it */ |
974 | scic_sds_controller_release_frame(scic, frame_index); | 974 | scic_sds_controller_release_frame(ihost, frame_index); |
975 | 975 | ||
976 | return result; | 976 | return result; |
977 | } | 977 | } |
@@ -994,33 +994,33 @@ static void scic_sds_phy_starting_initial_substate_enter(struct sci_base_state_m | |||
994 | static void scic_sds_phy_starting_await_sas_power_substate_enter(struct sci_base_state_machine *sm) | 994 | static void scic_sds_phy_starting_await_sas_power_substate_enter(struct sci_base_state_machine *sm) |
995 | { | 995 | { |
996 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); | 996 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); |
997 | struct scic_sds_controller *scic = iphy->owning_port->owning_controller; | 997 | struct isci_host *ihost = iphy->owning_port->owning_controller; |
998 | 998 | ||
999 | scic_sds_controller_power_control_queue_insert(scic, iphy); | 999 | scic_sds_controller_power_control_queue_insert(ihost, iphy); |
1000 | } | 1000 | } |
1001 | 1001 | ||
1002 | static void scic_sds_phy_starting_await_sas_power_substate_exit(struct sci_base_state_machine *sm) | 1002 | static void scic_sds_phy_starting_await_sas_power_substate_exit(struct sci_base_state_machine *sm) |
1003 | { | 1003 | { |
1004 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); | 1004 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); |
1005 | struct scic_sds_controller *scic = iphy->owning_port->owning_controller; | 1005 | struct isci_host *ihost = iphy->owning_port->owning_controller; |
1006 | 1006 | ||
1007 | scic_sds_controller_power_control_queue_remove(scic, iphy); | 1007 | scic_sds_controller_power_control_queue_remove(ihost, iphy); |
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | static void scic_sds_phy_starting_await_sata_power_substate_enter(struct sci_base_state_machine *sm) | 1010 | static void scic_sds_phy_starting_await_sata_power_substate_enter(struct sci_base_state_machine *sm) |
1011 | { | 1011 | { |
1012 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); | 1012 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); |
1013 | struct scic_sds_controller *scic = iphy->owning_port->owning_controller; | 1013 | struct isci_host *ihost = iphy->owning_port->owning_controller; |
1014 | 1014 | ||
1015 | scic_sds_controller_power_control_queue_insert(scic, iphy); | 1015 | scic_sds_controller_power_control_queue_insert(ihost, iphy); |
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | static void scic_sds_phy_starting_await_sata_power_substate_exit(struct sci_base_state_machine *sm) | 1018 | static void scic_sds_phy_starting_await_sata_power_substate_exit(struct sci_base_state_machine *sm) |
1019 | { | 1019 | { |
1020 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); | 1020 | struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm); |
1021 | struct scic_sds_controller *scic = iphy->owning_port->owning_controller; | 1021 | struct isci_host *ihost = iphy->owning_port->owning_controller; |
1022 | 1022 | ||
1023 | scic_sds_controller_power_control_queue_remove(scic, iphy); | 1023 | scic_sds_controller_power_control_queue_remove(ihost, iphy); |
1024 | } | 1024 | } |
1025 | 1025 | ||
1026 | static void scic_sds_phy_starting_await_sata_phy_substate_enter(struct sci_base_state_machine *sm) | 1026 | static void scic_sds_phy_starting_await_sata_phy_substate_enter(struct sci_base_state_machine *sm) |
@@ -1313,7 +1313,7 @@ void isci_phy_init(struct isci_phy *iphy, struct isci_host *ihost, int index) | |||
1313 | u64 sci_sas_addr; | 1313 | u64 sci_sas_addr; |
1314 | __be64 sas_addr; | 1314 | __be64 sas_addr; |
1315 | 1315 | ||
1316 | scic_oem_parameters_get(&ihost->sci, &oem); | 1316 | scic_oem_parameters_get(ihost, &oem); |
1317 | sci_sas_addr = oem.sds1.phys[index].sas_address.high; | 1317 | sci_sas_addr = oem.sds1.phys[index].sas_address.high; |
1318 | sci_sas_addr <<= 32; | 1318 | sci_sas_addr <<= 32; |
1319 | sci_sas_addr |= oem.sds1.phys[index].sas_address.low; | 1319 | sci_sas_addr |= oem.sds1.phys[index].sas_address.low; |
diff --git a/drivers/scsi/isci/port.c b/drivers/scsi/isci/port.c index df37b1bf7d11..c434d5a0effa 100644 --- a/drivers/scsi/isci/port.c +++ b/drivers/scsi/isci/port.c | |||
@@ -365,11 +365,11 @@ static void isci_port_not_ready(struct isci_host *isci_host, struct isci_port *i | |||
365 | "%s: isci_port = %p\n", __func__, isci_port); | 365 | "%s: isci_port = %p\n", __func__, isci_port); |
366 | } | 366 | } |
367 | 367 | ||
368 | static void isci_port_stop_complete(struct scic_sds_controller *scic, | 368 | static void isci_port_stop_complete(struct isci_host *ihost, |
369 | struct isci_port *iport, | 369 | struct isci_port *iport, |
370 | enum sci_status completion_status) | 370 | enum sci_status completion_status) |
371 | { | 371 | { |
372 | dev_dbg(&scic_to_ihost(scic)->pdev->dev, "Port stop complete\n"); | 372 | dev_dbg(&ihost->pdev->dev, "Port stop complete\n"); |
373 | } | 373 | } |
374 | 374 | ||
375 | /** | 375 | /** |
@@ -541,8 +541,7 @@ static enum sci_status scic_sds_port_clear_phy(struct isci_port *iport, | |||
541 | /* Make sure that this phy is part of this port */ | 541 | /* Make sure that this phy is part of this port */ |
542 | if (iport->phy_table[iphy->phy_index] == iphy && | 542 | if (iport->phy_table[iphy->phy_index] == iphy && |
543 | phy_get_non_dummy_port(iphy) == iport) { | 543 | phy_get_non_dummy_port(iphy) == iport) { |
544 | struct scic_sds_controller *scic = iport->owning_controller; | 544 | struct isci_host *ihost = iport->owning_controller; |
545 | struct isci_host *ihost = scic_to_ihost(scic); | ||
546 | 545 | ||
547 | /* Yep it is assigned to this port so remove it */ | 546 | /* Yep it is assigned to this port so remove it */ |
548 | scic_sds_phy_set_port(iphy, &ihost->ports[SCI_MAX_PORTS]); | 547 | scic_sds_phy_set_port(iphy, &ihost->ports[SCI_MAX_PORTS]); |
@@ -654,10 +653,10 @@ static void scic_sds_port_construct_dummy_rnc(struct isci_port *iport, u16 rni) | |||
654 | */ | 653 | */ |
655 | static void scic_sds_port_construct_dummy_task(struct isci_port *iport, u16 tag) | 654 | static void scic_sds_port_construct_dummy_task(struct isci_port *iport, u16 tag) |
656 | { | 655 | { |
657 | struct scic_sds_controller *scic = iport->owning_controller; | 656 | struct isci_host *ihost = iport->owning_controller; |
658 | struct scu_task_context *task_context; | 657 | struct scu_task_context *task_context; |
659 | 658 | ||
660 | task_context = &scic->task_context_table[ISCI_TAG_TCI(tag)]; | 659 | task_context = &ihost->task_context_table[ISCI_TAG_TCI(tag)]; |
661 | memset(task_context, 0, sizeof(struct scu_task_context)); | 660 | memset(task_context, 0, sizeof(struct scu_task_context)); |
662 | 661 | ||
663 | task_context->initiator_request = 1; | 662 | task_context->initiator_request = 1; |
@@ -674,13 +673,13 @@ static void scic_sds_port_construct_dummy_task(struct isci_port *iport, u16 tag) | |||
674 | 673 | ||
675 | static void scic_sds_port_destroy_dummy_resources(struct isci_port *iport) | 674 | static void scic_sds_port_destroy_dummy_resources(struct isci_port *iport) |
676 | { | 675 | { |
677 | struct scic_sds_controller *scic = iport->owning_controller; | 676 | struct isci_host *ihost = iport->owning_controller; |
678 | 677 | ||
679 | if (iport->reserved_tag != SCI_CONTROLLER_INVALID_IO_TAG) | 678 | if (iport->reserved_tag != SCI_CONTROLLER_INVALID_IO_TAG) |
680 | isci_free_tag(scic_to_ihost(scic), iport->reserved_tag); | 679 | isci_free_tag(ihost, iport->reserved_tag); |
681 | 680 | ||
682 | if (iport->reserved_rni != SCU_DUMMY_INDEX) | 681 | if (iport->reserved_rni != SCU_DUMMY_INDEX) |
683 | scic_sds_remote_node_table_release_remote_node_index(&scic->available_remote_nodes, | 682 | scic_sds_remote_node_table_release_remote_node_index(&ihost->available_remote_nodes, |
684 | 1, iport->reserved_rni); | 683 | 1, iport->reserved_rni); |
685 | 684 | ||
686 | iport->reserved_rni = SCU_DUMMY_INDEX; | 685 | iport->reserved_rni = SCU_DUMMY_INDEX; |
@@ -749,15 +748,14 @@ static void scic_sds_port_activate_phy(struct isci_port *iport, | |||
749 | struct isci_phy *iphy, | 748 | struct isci_phy *iphy, |
750 | bool do_notify_user) | 749 | bool do_notify_user) |
751 | { | 750 | { |
752 | struct scic_sds_controller *scic = iport->owning_controller; | 751 | struct isci_host *ihost = iport->owning_controller; |
753 | struct isci_host *ihost = scic_to_ihost(scic); | ||
754 | 752 | ||
755 | if (iphy->protocol != SCIC_SDS_PHY_PROTOCOL_SATA) | 753 | if (iphy->protocol != SCIC_SDS_PHY_PROTOCOL_SATA) |
756 | scic_sds_phy_resume(iphy); | 754 | scic_sds_phy_resume(iphy); |
757 | 755 | ||
758 | iport->active_phy_mask |= 1 << iphy->phy_index; | 756 | iport->active_phy_mask |= 1 << iphy->phy_index; |
759 | 757 | ||
760 | scic_sds_controller_clear_invalid_phy(scic, iphy); | 758 | scic_sds_controller_clear_invalid_phy(ihost, iphy); |
761 | 759 | ||
762 | if (do_notify_user == true) | 760 | if (do_notify_user == true) |
763 | isci_port_link_up(ihost, iport, iphy); | 761 | isci_port_link_up(ihost, iport, iphy); |
@@ -767,8 +765,7 @@ void scic_sds_port_deactivate_phy(struct isci_port *iport, | |||
767 | struct isci_phy *iphy, | 765 | struct isci_phy *iphy, |
768 | bool do_notify_user) | 766 | bool do_notify_user) |
769 | { | 767 | { |
770 | struct scic_sds_controller *scic = scic_sds_port_get_controller(iport); | 768 | struct isci_host *ihost = scic_sds_port_get_controller(iport); |
771 | struct isci_host *ihost = scic_to_ihost(scic); | ||
772 | 769 | ||
773 | iport->active_phy_mask &= ~(1 << iphy->phy_index); | 770 | iport->active_phy_mask &= ~(1 << iphy->phy_index); |
774 | 771 | ||
@@ -793,16 +790,16 @@ void scic_sds_port_deactivate_phy(struct isci_port *iport, | |||
793 | static void scic_sds_port_invalid_link_up(struct isci_port *iport, | 790 | static void scic_sds_port_invalid_link_up(struct isci_port *iport, |
794 | struct isci_phy *iphy) | 791 | struct isci_phy *iphy) |
795 | { | 792 | { |
796 | struct scic_sds_controller *scic = iport->owning_controller; | 793 | struct isci_host *ihost = iport->owning_controller; |
797 | 794 | ||
798 | /* | 795 | /* |
799 | * Check to see if we have alreay reported this link as bad and if | 796 | * Check to see if we have alreay reported this link as bad and if |
800 | * not go ahead and tell the SCI_USER that we have discovered an | 797 | * not go ahead and tell the SCI_USER that we have discovered an |
801 | * invalid link. | 798 | * invalid link. |
802 | */ | 799 | */ |
803 | if ((scic->invalid_phy_mask & (1 << iphy->phy_index)) == 0) { | 800 | if ((ihost->invalid_phy_mask & (1 << iphy->phy_index)) == 0) { |
804 | scic_sds_controller_set_invalid_phy(scic, iphy); | 801 | scic_sds_controller_set_invalid_phy(ihost, iphy); |
805 | dev_warn(&scic_to_ihost(scic)->pdev->dev, "Invalid link up!\n"); | 802 | dev_warn(&ihost->pdev->dev, "Invalid link up!\n"); |
806 | } | 803 | } |
807 | } | 804 | } |
808 | 805 | ||
@@ -931,7 +928,7 @@ static void port_timeout(unsigned long data) | |||
931 | { | 928 | { |
932 | struct sci_timer *tmr = (struct sci_timer *)data; | 929 | struct sci_timer *tmr = (struct sci_timer *)data; |
933 | struct isci_port *iport = container_of(tmr, typeof(*iport), timer); | 930 | struct isci_port *iport = container_of(tmr, typeof(*iport), timer); |
934 | struct isci_host *ihost = scic_to_ihost(iport->owning_controller); | 931 | struct isci_host *ihost = iport->owning_controller; |
935 | unsigned long flags; | 932 | unsigned long flags; |
936 | u32 current_state; | 933 | u32 current_state; |
937 | 934 | ||
@@ -1041,19 +1038,19 @@ static void scic_sds_port_suspend_port_task_scheduler(struct isci_port *iport) | |||
1041 | */ | 1038 | */ |
1042 | static void scic_sds_port_post_dummy_request(struct isci_port *iport) | 1039 | static void scic_sds_port_post_dummy_request(struct isci_port *iport) |
1043 | { | 1040 | { |
1044 | struct scic_sds_controller *scic = iport->owning_controller; | 1041 | struct isci_host *ihost = iport->owning_controller; |
1045 | u16 tag = iport->reserved_tag; | 1042 | u16 tag = iport->reserved_tag; |
1046 | struct scu_task_context *tc; | 1043 | struct scu_task_context *tc; |
1047 | u32 command; | 1044 | u32 command; |
1048 | 1045 | ||
1049 | tc = &scic->task_context_table[ISCI_TAG_TCI(tag)]; | 1046 | tc = &ihost->task_context_table[ISCI_TAG_TCI(tag)]; |
1050 | tc->abort = 0; | 1047 | tc->abort = 0; |
1051 | 1048 | ||
1052 | command = SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC | | 1049 | command = SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC | |
1053 | iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | | 1050 | iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | |
1054 | ISCI_TAG_TCI(tag); | 1051 | ISCI_TAG_TCI(tag); |
1055 | 1052 | ||
1056 | scic_sds_controller_post_request(scic, command); | 1053 | scic_sds_controller_post_request(ihost, command); |
1057 | } | 1054 | } |
1058 | 1055 | ||
1059 | /** | 1056 | /** |
@@ -1065,19 +1062,19 @@ static void scic_sds_port_post_dummy_request(struct isci_port *iport) | |||
1065 | */ | 1062 | */ |
1066 | static void scic_sds_port_abort_dummy_request(struct isci_port *iport) | 1063 | static void scic_sds_port_abort_dummy_request(struct isci_port *iport) |
1067 | { | 1064 | { |
1068 | struct scic_sds_controller *scic = iport->owning_controller; | 1065 | struct isci_host *ihost = iport->owning_controller; |
1069 | u16 tag = iport->reserved_tag; | 1066 | u16 tag = iport->reserved_tag; |
1070 | struct scu_task_context *tc; | 1067 | struct scu_task_context *tc; |
1071 | u32 command; | 1068 | u32 command; |
1072 | 1069 | ||
1073 | tc = &scic->task_context_table[ISCI_TAG_TCI(tag)]; | 1070 | tc = &ihost->task_context_table[ISCI_TAG_TCI(tag)]; |
1074 | tc->abort = 1; | 1071 | tc->abort = 1; |
1075 | 1072 | ||
1076 | command = SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT | | 1073 | command = SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT | |
1077 | iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | | 1074 | iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | |
1078 | ISCI_TAG_TCI(tag); | 1075 | ISCI_TAG_TCI(tag); |
1079 | 1076 | ||
1080 | scic_sds_controller_post_request(scic, command); | 1077 | scic_sds_controller_post_request(ihost, command); |
1081 | } | 1078 | } |
1082 | 1079 | ||
1083 | /** | 1080 | /** |
@@ -1115,8 +1112,7 @@ static void scic_sds_port_ready_substate_operational_enter(struct sci_base_state | |||
1115 | { | 1112 | { |
1116 | u32 index; | 1113 | u32 index; |
1117 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); | 1114 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); |
1118 | struct scic_sds_controller *scic = iport->owning_controller; | 1115 | struct isci_host *ihost = iport->owning_controller; |
1119 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1120 | 1116 | ||
1121 | isci_port_ready(ihost, iport); | 1117 | isci_port_ready(ihost, iport); |
1122 | 1118 | ||
@@ -1141,13 +1137,13 @@ static void scic_sds_port_ready_substate_operational_enter(struct sci_base_state | |||
1141 | 1137 | ||
1142 | static void scic_sds_port_invalidate_dummy_remote_node(struct isci_port *iport) | 1138 | static void scic_sds_port_invalidate_dummy_remote_node(struct isci_port *iport) |
1143 | { | 1139 | { |
1144 | struct scic_sds_controller *scic = iport->owning_controller; | 1140 | struct isci_host *ihost = iport->owning_controller; |
1145 | u8 phys_index = iport->physical_port_index; | 1141 | u8 phys_index = iport->physical_port_index; |
1146 | union scu_remote_node_context *rnc; | 1142 | union scu_remote_node_context *rnc; |
1147 | u16 rni = iport->reserved_rni; | 1143 | u16 rni = iport->reserved_rni; |
1148 | u32 command; | 1144 | u32 command; |
1149 | 1145 | ||
1150 | rnc = &scic->remote_node_context_table[rni]; | 1146 | rnc = &ihost->remote_node_context_table[rni]; |
1151 | 1147 | ||
1152 | rnc->ssp.is_valid = false; | 1148 | rnc->ssp.is_valid = false; |
1153 | 1149 | ||
@@ -1155,13 +1151,13 @@ static void scic_sds_port_invalidate_dummy_remote_node(struct isci_port *iport) | |||
1155 | * controller and give it ample time to act before posting the rnc | 1151 | * controller and give it ample time to act before posting the rnc |
1156 | * invalidate | 1152 | * invalidate |
1157 | */ | 1153 | */ |
1158 | readl(&scic->smu_registers->interrupt_status); /* flush */ | 1154 | readl(&ihost->smu_registers->interrupt_status); /* flush */ |
1159 | udelay(10); | 1155 | udelay(10); |
1160 | 1156 | ||
1161 | command = SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE | | 1157 | command = SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE | |
1162 | phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; | 1158 | phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; |
1163 | 1159 | ||
1164 | scic_sds_controller_post_request(scic, command); | 1160 | scic_sds_controller_post_request(ihost, command); |
1165 | } | 1161 | } |
1166 | 1162 | ||
1167 | /** | 1163 | /** |
@@ -1175,8 +1171,7 @@ static void scic_sds_port_invalidate_dummy_remote_node(struct isci_port *iport) | |||
1175 | static void scic_sds_port_ready_substate_operational_exit(struct sci_base_state_machine *sm) | 1171 | static void scic_sds_port_ready_substate_operational_exit(struct sci_base_state_machine *sm) |
1176 | { | 1172 | { |
1177 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); | 1173 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); |
1178 | struct scic_sds_controller *scic = iport->owning_controller; | 1174 | struct isci_host *ihost = iport->owning_controller; |
1179 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1180 | 1175 | ||
1181 | /* | 1176 | /* |
1182 | * Kill the dummy task for this port if it has not yet posted | 1177 | * Kill the dummy task for this port if it has not yet posted |
@@ -1194,8 +1189,7 @@ static void scic_sds_port_ready_substate_operational_exit(struct sci_base_state_ | |||
1194 | static void scic_sds_port_ready_substate_configuring_enter(struct sci_base_state_machine *sm) | 1189 | static void scic_sds_port_ready_substate_configuring_enter(struct sci_base_state_machine *sm) |
1195 | { | 1190 | { |
1196 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); | 1191 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); |
1197 | struct scic_sds_controller *scic = iport->owning_controller; | 1192 | struct isci_host *ihost = iport->owning_controller; |
1198 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1199 | 1193 | ||
1200 | if (iport->active_phy_mask == 0) { | 1194 | if (iport->active_phy_mask == 0) { |
1201 | isci_port_not_ready(ihost, iport); | 1195 | isci_port_not_ready(ihost, iport); |
@@ -1218,7 +1212,7 @@ static void scic_sds_port_ready_substate_configuring_exit(struct sci_base_state_ | |||
1218 | 1212 | ||
1219 | enum sci_status scic_sds_port_start(struct isci_port *iport) | 1213 | enum sci_status scic_sds_port_start(struct isci_port *iport) |
1220 | { | 1214 | { |
1221 | struct scic_sds_controller *scic = iport->owning_controller; | 1215 | struct isci_host *ihost = iport->owning_controller; |
1222 | enum sci_status status = SCI_SUCCESS; | 1216 | enum sci_status status = SCI_SUCCESS; |
1223 | enum scic_sds_port_states state; | 1217 | enum scic_sds_port_states state; |
1224 | u32 phy_mask; | 1218 | u32 phy_mask; |
@@ -1241,7 +1235,7 @@ enum sci_status scic_sds_port_start(struct isci_port *iport) | |||
1241 | 1235 | ||
1242 | if (iport->reserved_rni == SCU_DUMMY_INDEX) { | 1236 | if (iport->reserved_rni == SCU_DUMMY_INDEX) { |
1243 | u16 rni = scic_sds_remote_node_table_allocate_remote_node( | 1237 | u16 rni = scic_sds_remote_node_table_allocate_remote_node( |
1244 | &scic->available_remote_nodes, 1); | 1238 | &ihost->available_remote_nodes, 1); |
1245 | 1239 | ||
1246 | if (rni != SCU_DUMMY_INDEX) | 1240 | if (rni != SCU_DUMMY_INDEX) |
1247 | scic_sds_port_construct_dummy_rnc(iport, rni); | 1241 | scic_sds_port_construct_dummy_rnc(iport, rni); |
@@ -1251,7 +1245,6 @@ enum sci_status scic_sds_port_start(struct isci_port *iport) | |||
1251 | } | 1245 | } |
1252 | 1246 | ||
1253 | if (iport->reserved_tag == SCI_CONTROLLER_INVALID_IO_TAG) { | 1247 | if (iport->reserved_tag == SCI_CONTROLLER_INVALID_IO_TAG) { |
1254 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1255 | u16 tag; | 1248 | u16 tag; |
1256 | 1249 | ||
1257 | tag = isci_alloc_tag(ihost); | 1250 | tag = isci_alloc_tag(ihost); |
@@ -1634,30 +1627,30 @@ scic_sds_port_disable_port_task_scheduler(struct isci_port *iport) | |||
1634 | 1627 | ||
1635 | static void scic_sds_port_post_dummy_remote_node(struct isci_port *iport) | 1628 | static void scic_sds_port_post_dummy_remote_node(struct isci_port *iport) |
1636 | { | 1629 | { |
1637 | struct scic_sds_controller *scic = iport->owning_controller; | 1630 | struct isci_host *ihost = iport->owning_controller; |
1638 | u8 phys_index = iport->physical_port_index; | 1631 | u8 phys_index = iport->physical_port_index; |
1639 | union scu_remote_node_context *rnc; | 1632 | union scu_remote_node_context *rnc; |
1640 | u16 rni = iport->reserved_rni; | 1633 | u16 rni = iport->reserved_rni; |
1641 | u32 command; | 1634 | u32 command; |
1642 | 1635 | ||
1643 | rnc = &scic->remote_node_context_table[rni]; | 1636 | rnc = &ihost->remote_node_context_table[rni]; |
1644 | rnc->ssp.is_valid = true; | 1637 | rnc->ssp.is_valid = true; |
1645 | 1638 | ||
1646 | command = SCU_CONTEXT_COMMAND_POST_RNC_32 | | 1639 | command = SCU_CONTEXT_COMMAND_POST_RNC_32 | |
1647 | phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; | 1640 | phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; |
1648 | 1641 | ||
1649 | scic_sds_controller_post_request(scic, command); | 1642 | scic_sds_controller_post_request(ihost, command); |
1650 | 1643 | ||
1651 | /* ensure hardware has seen the post rnc command and give it | 1644 | /* ensure hardware has seen the post rnc command and give it |
1652 | * ample time to act before sending the suspend | 1645 | * ample time to act before sending the suspend |
1653 | */ | 1646 | */ |
1654 | readl(&scic->smu_registers->interrupt_status); /* flush */ | 1647 | readl(&ihost->smu_registers->interrupt_status); /* flush */ |
1655 | udelay(10); | 1648 | udelay(10); |
1656 | 1649 | ||
1657 | command = SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX_RX | | 1650 | command = SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX_RX | |
1658 | phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; | 1651 | phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; |
1659 | 1652 | ||
1660 | scic_sds_controller_post_request(scic, command); | 1653 | scic_sds_controller_post_request(ihost, command); |
1661 | } | 1654 | } |
1662 | 1655 | ||
1663 | static void scic_sds_port_stopped_state_enter(struct sci_base_state_machine *sm) | 1656 | static void scic_sds_port_stopped_state_enter(struct sci_base_state_machine *sm) |
@@ -1684,8 +1677,7 @@ static void scic_sds_port_stopped_state_exit(struct sci_base_state_machine *sm) | |||
1684 | static void scic_sds_port_ready_state_enter(struct sci_base_state_machine *sm) | 1677 | static void scic_sds_port_ready_state_enter(struct sci_base_state_machine *sm) |
1685 | { | 1678 | { |
1686 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); | 1679 | struct isci_port *iport = container_of(sm, typeof(*iport), sm); |
1687 | struct scic_sds_controller *scic = iport->owning_controller; | 1680 | struct isci_host *ihost = iport->owning_controller; |
1688 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1689 | u32 prev_state; | 1681 | u32 prev_state; |
1690 | 1682 | ||
1691 | prev_state = iport->sm.previous_state_id; | 1683 | prev_state = iport->sm.previous_state_id; |
@@ -1758,7 +1750,7 @@ static const struct sci_base_state scic_sds_port_state_table[] = { | |||
1758 | }; | 1750 | }; |
1759 | 1751 | ||
1760 | void scic_sds_port_construct(struct isci_port *iport, u8 index, | 1752 | void scic_sds_port_construct(struct isci_port *iport, u8 index, |
1761 | struct scic_sds_controller *scic) | 1753 | struct isci_host *ihost) |
1762 | { | 1754 | { |
1763 | sci_init_sm(&iport->sm, scic_sds_port_state_table, SCI_PORT_STOPPED); | 1755 | sci_init_sm(&iport->sm, scic_sds_port_state_table, SCI_PORT_STOPPED); |
1764 | 1756 | ||
@@ -1767,7 +1759,7 @@ void scic_sds_port_construct(struct isci_port *iport, u8 index, | |||
1767 | iport->active_phy_mask = 0; | 1759 | iport->active_phy_mask = 0; |
1768 | iport->ready_exit = false; | 1760 | iport->ready_exit = false; |
1769 | 1761 | ||
1770 | iport->owning_controller = scic; | 1762 | iport->owning_controller = ihost; |
1771 | 1763 | ||
1772 | iport->started_request_count = 0; | 1764 | iport->started_request_count = 0; |
1773 | iport->assigned_device_count = 0; | 1765 | iport->assigned_device_count = 0; |
@@ -1810,8 +1802,7 @@ void scic_sds_port_broadcast_change_received( | |||
1810 | struct isci_port *iport, | 1802 | struct isci_port *iport, |
1811 | struct isci_phy *iphy) | 1803 | struct isci_phy *iphy) |
1812 | { | 1804 | { |
1813 | struct scic_sds_controller *scic = iport->owning_controller; | 1805 | struct isci_host *ihost = iport->owning_controller; |
1814 | struct isci_host *ihost = scic_to_ihost(scic); | ||
1815 | 1806 | ||
1816 | /* notify the user. */ | 1807 | /* notify the user. */ |
1817 | isci_port_bc_change_received(ihost, iport, iphy); | 1808 | isci_port_bc_change_received(ihost, iport, iphy); |
diff --git a/drivers/scsi/isci/port.h b/drivers/scsi/isci/port.h index b9bc89bf6519..9a9be7b47b4a 100644 --- a/drivers/scsi/isci/port.h +++ b/drivers/scsi/isci/port.h | |||
@@ -115,7 +115,7 @@ struct isci_port { | |||
115 | u32 assigned_device_count; | 115 | u32 assigned_device_count; |
116 | u32 not_ready_reason; | 116 | u32 not_ready_reason; |
117 | struct isci_phy *phy_table[SCI_MAX_PHYS]; | 117 | struct isci_phy *phy_table[SCI_MAX_PHYS]; |
118 | struct scic_sds_controller *owning_controller; | 118 | struct isci_host *owning_controller; |
119 | struct sci_timer timer; | 119 | struct sci_timer timer; |
120 | struct scu_port_task_scheduler_registers __iomem *port_task_scheduler_registers; | 120 | struct scu_port_task_scheduler_registers __iomem *port_task_scheduler_registers; |
121 | /* XXX rework: only one register, no need to replicate per-port */ | 121 | /* XXX rework: only one register, no need to replicate per-port */ |
@@ -243,7 +243,7 @@ static inline void scic_sds_port_decrement_request_count(struct isci_port *iport | |||
243 | void scic_sds_port_construct( | 243 | void scic_sds_port_construct( |
244 | struct isci_port *iport, | 244 | struct isci_port *iport, |
245 | u8 port_index, | 245 | u8 port_index, |
246 | struct scic_sds_controller *scic); | 246 | struct isci_host *ihost); |
247 | 247 | ||
248 | enum sci_status scic_sds_port_initialize( | 248 | enum sci_status scic_sds_port_initialize( |
249 | struct isci_port *iport, | 249 | struct isci_port *iport, |
diff --git a/drivers/scsi/isci/port_config.c b/drivers/scsi/isci/port_config.c index bb62d2a25217..a0a135d54e95 100644 --- a/drivers/scsi/isci/port_config.c +++ b/drivers/scsi/isci/port_config.c | |||
@@ -113,7 +113,7 @@ static s32 sci_sas_address_compare( | |||
113 | * NULL if there is no matching port for the phy. | 113 | * NULL if there is no matching port for the phy. |
114 | */ | 114 | */ |
115 | static struct isci_port *scic_sds_port_configuration_agent_find_port( | 115 | static struct isci_port *scic_sds_port_configuration_agent_find_port( |
116 | struct scic_sds_controller *scic, | 116 | struct isci_host *ihost, |
117 | struct isci_phy *iphy) | 117 | struct isci_phy *iphy) |
118 | { | 118 | { |
119 | u8 i; | 119 | u8 i; |
@@ -130,8 +130,7 @@ static struct isci_port *scic_sds_port_configuration_agent_find_port( | |||
130 | scic_sds_phy_get_sas_address(iphy, &phy_sas_address); | 130 | scic_sds_phy_get_sas_address(iphy, &phy_sas_address); |
131 | scic_sds_phy_get_attached_sas_address(iphy, &phy_attached_device_address); | 131 | scic_sds_phy_get_attached_sas_address(iphy, &phy_attached_device_address); |
132 | 132 | ||
133 | for (i = 0; i < scic->logical_port_entries; i++) { | 133 | for (i = 0; i < ihost->logical_port_entries; i++) { |
134 | struct isci_host *ihost = scic_to_ihost(scic); | ||
135 | struct isci_port *iport = &ihost->ports[i]; | 134 | struct isci_port *iport = &ihost->ports[i]; |
136 | 135 | ||
137 | scic_sds_port_get_sas_address(iport, &port_sas_address); | 136 | scic_sds_port_get_sas_address(iport, &port_sas_address); |
@@ -158,10 +157,9 @@ static struct isci_port *scic_sds_port_configuration_agent_find_port( | |||
158 | * the port configuration is not valid for this port configuration agent. | 157 | * the port configuration is not valid for this port configuration agent. |
159 | */ | 158 | */ |
160 | static enum sci_status scic_sds_port_configuration_agent_validate_ports( | 159 | static enum sci_status scic_sds_port_configuration_agent_validate_ports( |
161 | struct scic_sds_controller *controller, | 160 | struct isci_host *ihost, |
162 | struct scic_sds_port_configuration_agent *port_agent) | 161 | struct scic_sds_port_configuration_agent *port_agent) |
163 | { | 162 | { |
164 | struct isci_host *ihost = scic_to_ihost(controller); | ||
165 | struct sci_sas_address first_address; | 163 | struct sci_sas_address first_address; |
166 | struct sci_sas_address second_address; | 164 | struct sci_sas_address second_address; |
167 | 165 | ||
@@ -239,17 +237,11 @@ static enum sci_status scic_sds_port_configuration_agent_validate_ports( | |||
239 | * Manual port configuration agent routines | 237 | * Manual port configuration agent routines |
240 | * ****************************************************************************** */ | 238 | * ****************************************************************************** */ |
241 | 239 | ||
242 | /** | 240 | /* verify all of the phys in the same port are using the same SAS address */ |
243 | * | 241 | static enum sci_status |
244 | * | 242 | scic_sds_mpc_agent_validate_phy_configuration(struct isci_host *ihost, |
245 | * This routine will verify that all of the phys in the same port are using the | 243 | struct scic_sds_port_configuration_agent *port_agent) |
246 | * same SAS address. | ||
247 | */ | ||
248 | static enum sci_status scic_sds_mpc_agent_validate_phy_configuration( | ||
249 | struct scic_sds_controller *controller, | ||
250 | struct scic_sds_port_configuration_agent *port_agent) | ||
251 | { | 244 | { |
252 | struct isci_host *ihost = scic_to_ihost(controller); | ||
253 | u32 phy_mask; | 245 | u32 phy_mask; |
254 | u32 assigned_phy_mask; | 246 | u32 assigned_phy_mask; |
255 | struct sci_sas_address sas_address; | 247 | struct sci_sas_address sas_address; |
@@ -262,7 +254,7 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration( | |||
262 | sas_address.low = 0; | 254 | sas_address.low = 0; |
263 | 255 | ||
264 | for (port_index = 0; port_index < SCI_MAX_PORTS; port_index++) { | 256 | for (port_index = 0; port_index < SCI_MAX_PORTS; port_index++) { |
265 | phy_mask = controller->oem_parameters.sds1.ports[port_index].phy_mask; | 257 | phy_mask = ihost->oem_parameters.sds1.ports[port_index].phy_mask; |
266 | 258 | ||
267 | if (!phy_mask) | 259 | if (!phy_mask) |
268 | continue; | 260 | continue; |
@@ -324,7 +316,7 @@ static enum sci_status scic_sds_mpc_agent_validate_phy_configuration( | |||
324 | phy_index++; | 316 | phy_index++; |
325 | } | 317 | } |
326 | 318 | ||
327 | return scic_sds_port_configuration_agent_validate_ports(controller, port_agent); | 319 | return scic_sds_port_configuration_agent_validate_ports(ihost, port_agent); |
328 | } | 320 | } |
329 | 321 | ||
330 | static void mpc_agent_timeout(unsigned long data) | 322 | static void mpc_agent_timeout(unsigned long data) |
@@ -332,14 +324,12 @@ static void mpc_agent_timeout(unsigned long data) | |||
332 | u8 index; | 324 | u8 index; |
333 | struct sci_timer *tmr = (struct sci_timer *)data; | 325 | struct sci_timer *tmr = (struct sci_timer *)data; |
334 | struct scic_sds_port_configuration_agent *port_agent; | 326 | struct scic_sds_port_configuration_agent *port_agent; |
335 | struct scic_sds_controller *scic; | ||
336 | struct isci_host *ihost; | 327 | struct isci_host *ihost; |
337 | unsigned long flags; | 328 | unsigned long flags; |
338 | u16 configure_phy_mask; | 329 | u16 configure_phy_mask; |
339 | 330 | ||
340 | port_agent = container_of(tmr, typeof(*port_agent), timer); | 331 | port_agent = container_of(tmr, typeof(*port_agent), timer); |
341 | scic = container_of(port_agent, typeof(*scic), port_agent); | 332 | ihost = container_of(port_agent, typeof(*ihost), port_agent); |
342 | ihost = scic_to_ihost(scic); | ||
343 | 333 | ||
344 | spin_lock_irqsave(&ihost->scic_lock, flags); | 334 | spin_lock_irqsave(&ihost->scic_lock, flags); |
345 | 335 | ||
@@ -355,7 +345,7 @@ static void mpc_agent_timeout(unsigned long data) | |||
355 | struct isci_phy *iphy = &ihost->phys[index]; | 345 | struct isci_phy *iphy = &ihost->phys[index]; |
356 | 346 | ||
357 | if (configure_phy_mask & (1 << index)) { | 347 | if (configure_phy_mask & (1 << index)) { |
358 | port_agent->link_up_handler(scic, port_agent, | 348 | port_agent->link_up_handler(ihost, port_agent, |
359 | phy_get_non_dummy_port(iphy), | 349 | phy_get_non_dummy_port(iphy), |
360 | iphy); | 350 | iphy); |
361 | } | 351 | } |
@@ -365,7 +355,7 @@ done: | |||
365 | spin_unlock_irqrestore(&ihost->scic_lock, flags); | 355 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
366 | } | 356 | } |
367 | 357 | ||
368 | static void scic_sds_mpc_agent_link_up(struct scic_sds_controller *controller, | 358 | static void scic_sds_mpc_agent_link_up(struct isci_host *ihost, |
369 | struct scic_sds_port_configuration_agent *port_agent, | 359 | struct scic_sds_port_configuration_agent *port_agent, |
370 | struct isci_port *iport, | 360 | struct isci_port *iport, |
371 | struct isci_phy *iphy) | 361 | struct isci_phy *iphy) |
@@ -401,7 +391,7 @@ static void scic_sds_mpc_agent_link_up(struct scic_sds_controller *controller, | |||
401 | * link down notification from a phy that has no assocoated port? | 391 | * link down notification from a phy that has no assocoated port? |
402 | */ | 392 | */ |
403 | static void scic_sds_mpc_agent_link_down( | 393 | static void scic_sds_mpc_agent_link_down( |
404 | struct scic_sds_controller *scic, | 394 | struct isci_host *ihost, |
405 | struct scic_sds_port_configuration_agent *port_agent, | 395 | struct scic_sds_port_configuration_agent *port_agent, |
406 | struct isci_port *iport, | 396 | struct isci_port *iport, |
407 | struct isci_phy *iphy) | 397 | struct isci_phy *iphy) |
@@ -438,26 +428,17 @@ static void scic_sds_mpc_agent_link_down( | |||
438 | } | 428 | } |
439 | } | 429 | } |
440 | 430 | ||
441 | /* | 431 | /* verify phys are assigned a valid SAS address for automatic port |
442 | * ****************************************************************************** | 432 | * configuration mode. |
443 | * Automatic port configuration agent routines | ||
444 | * ****************************************************************************** */ | ||
445 | |||
446 | /** | ||
447 | * | ||
448 | * | ||
449 | * This routine will verify that the phys are assigned a valid SAS address for | ||
450 | * automatic port configuration mode. | ||
451 | */ | 433 | */ |
452 | static enum sci_status scic_sds_apc_agent_validate_phy_configuration( | 434 | static enum sci_status |
453 | struct scic_sds_controller *controller, | 435 | scic_sds_apc_agent_validate_phy_configuration(struct isci_host *ihost, |
454 | struct scic_sds_port_configuration_agent *port_agent) | 436 | struct scic_sds_port_configuration_agent *port_agent) |
455 | { | 437 | { |
456 | u8 phy_index; | 438 | u8 phy_index; |
457 | u8 port_index; | 439 | u8 port_index; |
458 | struct sci_sas_address sas_address; | 440 | struct sci_sas_address sas_address; |
459 | struct sci_sas_address phy_assigned_address; | 441 | struct sci_sas_address phy_assigned_address; |
460 | struct isci_host *ihost = scic_to_ihost(controller); | ||
461 | 442 | ||
462 | phy_index = 0; | 443 | phy_index = 0; |
463 | 444 | ||
@@ -484,10 +465,10 @@ static enum sci_status scic_sds_apc_agent_validate_phy_configuration( | |||
484 | } | 465 | } |
485 | } | 466 | } |
486 | 467 | ||
487 | return scic_sds_port_configuration_agent_validate_ports(controller, port_agent); | 468 | return scic_sds_port_configuration_agent_validate_ports(ihost, port_agent); |
488 | } | 469 | } |
489 | 470 | ||
490 | static void scic_sds_apc_agent_configure_ports(struct scic_sds_controller *controller, | 471 | static void scic_sds_apc_agent_configure_ports(struct isci_host *ihost, |
491 | struct scic_sds_port_configuration_agent *port_agent, | 472 | struct scic_sds_port_configuration_agent *port_agent, |
492 | struct isci_phy *iphy, | 473 | struct isci_phy *iphy, |
493 | bool start_timer) | 474 | bool start_timer) |
@@ -496,9 +477,8 @@ static void scic_sds_apc_agent_configure_ports(struct scic_sds_controller *contr | |||
496 | enum sci_status status; | 477 | enum sci_status status; |
497 | struct isci_port *iport; | 478 | struct isci_port *iport; |
498 | enum SCIC_SDS_APC_ACTIVITY apc_activity = SCIC_SDS_APC_SKIP_PHY; | 479 | enum SCIC_SDS_APC_ACTIVITY apc_activity = SCIC_SDS_APC_SKIP_PHY; |
499 | struct isci_host *ihost = scic_to_ihost(controller); | ||
500 | 480 | ||
501 | iport = scic_sds_port_configuration_agent_find_port(controller, iphy); | 481 | iport = scic_sds_port_configuration_agent_find_port(ihost, iphy); |
502 | 482 | ||
503 | if (iport) { | 483 | if (iport) { |
504 | if (scic_sds_port_is_valid_phy_assignment(iport, iphy->phy_index)) | 484 | if (scic_sds_port_is_valid_phy_assignment(iport, iphy->phy_index)) |
@@ -619,7 +599,7 @@ static void scic_sds_apc_agent_configure_ports(struct scic_sds_controller *contr | |||
619 | * notifications. Is it possible to get a link down notification from a phy | 599 | * notifications. Is it possible to get a link down notification from a phy |
620 | * that has no assocoated port? | 600 | * that has no assocoated port? |
621 | */ | 601 | */ |
622 | static void scic_sds_apc_agent_link_up(struct scic_sds_controller *scic, | 602 | static void scic_sds_apc_agent_link_up(struct isci_host *ihost, |
623 | struct scic_sds_port_configuration_agent *port_agent, | 603 | struct scic_sds_port_configuration_agent *port_agent, |
624 | struct isci_port *iport, | 604 | struct isci_port *iport, |
625 | struct isci_phy *iphy) | 605 | struct isci_phy *iphy) |
@@ -629,7 +609,7 @@ static void scic_sds_apc_agent_link_up(struct scic_sds_controller *scic, | |||
629 | if (!iport) { | 609 | if (!iport) { |
630 | /* the phy is not the part of this port */ | 610 | /* the phy is not the part of this port */ |
631 | port_agent->phy_ready_mask |= 1 << phy_index; | 611 | port_agent->phy_ready_mask |= 1 << phy_index; |
632 | scic_sds_apc_agent_configure_ports(scic, port_agent, iphy, true); | 612 | scic_sds_apc_agent_configure_ports(ihost, port_agent, iphy, true); |
633 | } else { | 613 | } else { |
634 | /* the phy is already the part of the port */ | 614 | /* the phy is already the part of the port */ |
635 | u32 port_state = iport->sm.current_state_id; | 615 | u32 port_state = iport->sm.current_state_id; |
@@ -658,7 +638,7 @@ static void scic_sds_apc_agent_link_up(struct scic_sds_controller *scic, | |||
658 | * port? | 638 | * port? |
659 | */ | 639 | */ |
660 | static void scic_sds_apc_agent_link_down( | 640 | static void scic_sds_apc_agent_link_down( |
661 | struct scic_sds_controller *controller, | 641 | struct isci_host *ihost, |
662 | struct scic_sds_port_configuration_agent *port_agent, | 642 | struct scic_sds_port_configuration_agent *port_agent, |
663 | struct isci_port *iport, | 643 | struct isci_port *iport, |
664 | struct isci_phy *iphy) | 644 | struct isci_phy *iphy) |
@@ -683,14 +663,12 @@ static void apc_agent_timeout(unsigned long data) | |||
683 | u32 index; | 663 | u32 index; |
684 | struct sci_timer *tmr = (struct sci_timer *)data; | 664 | struct sci_timer *tmr = (struct sci_timer *)data; |
685 | struct scic_sds_port_configuration_agent *port_agent; | 665 | struct scic_sds_port_configuration_agent *port_agent; |
686 | struct scic_sds_controller *scic; | ||
687 | struct isci_host *ihost; | 666 | struct isci_host *ihost; |
688 | unsigned long flags; | 667 | unsigned long flags; |
689 | u16 configure_phy_mask; | 668 | u16 configure_phy_mask; |
690 | 669 | ||
691 | port_agent = container_of(tmr, typeof(*port_agent), timer); | 670 | port_agent = container_of(tmr, typeof(*port_agent), timer); |
692 | scic = container_of(port_agent, typeof(*scic), port_agent); | 671 | ihost = container_of(port_agent, typeof(*ihost), port_agent); |
693 | ihost = scic_to_ihost(scic); | ||
694 | 672 | ||
695 | spin_lock_irqsave(&ihost->scic_lock, flags); | 673 | spin_lock_irqsave(&ihost->scic_lock, flags); |
696 | 674 | ||
@@ -708,7 +686,7 @@ static void apc_agent_timeout(unsigned long data) | |||
708 | if ((configure_phy_mask & (1 << index)) == 0) | 686 | if ((configure_phy_mask & (1 << index)) == 0) |
709 | continue; | 687 | continue; |
710 | 688 | ||
711 | scic_sds_apc_agent_configure_ports(scic, port_agent, | 689 | scic_sds_apc_agent_configure_ports(ihost, port_agent, |
712 | &ihost->phys[index], false); | 690 | &ihost->phys[index], false); |
713 | } | 691 | } |
714 | 692 | ||
@@ -748,17 +726,17 @@ void scic_sds_port_configuration_agent_construct( | |||
748 | } | 726 | } |
749 | 727 | ||
750 | enum sci_status scic_sds_port_configuration_agent_initialize( | 728 | enum sci_status scic_sds_port_configuration_agent_initialize( |
751 | struct scic_sds_controller *scic, | 729 | struct isci_host *ihost, |
752 | struct scic_sds_port_configuration_agent *port_agent) | 730 | struct scic_sds_port_configuration_agent *port_agent) |
753 | { | 731 | { |
754 | enum sci_status status; | 732 | enum sci_status status; |
755 | enum scic_port_configuration_mode mode; | 733 | enum scic_port_configuration_mode mode; |
756 | 734 | ||
757 | mode = scic->oem_parameters.sds1.controller.mode_type; | 735 | mode = ihost->oem_parameters.sds1.controller.mode_type; |
758 | 736 | ||
759 | if (mode == SCIC_PORT_MANUAL_CONFIGURATION_MODE) { | 737 | if (mode == SCIC_PORT_MANUAL_CONFIGURATION_MODE) { |
760 | status = scic_sds_mpc_agent_validate_phy_configuration( | 738 | status = scic_sds_mpc_agent_validate_phy_configuration( |
761 | scic, port_agent); | 739 | ihost, port_agent); |
762 | 740 | ||
763 | port_agent->link_up_handler = scic_sds_mpc_agent_link_up; | 741 | port_agent->link_up_handler = scic_sds_mpc_agent_link_up; |
764 | port_agent->link_down_handler = scic_sds_mpc_agent_link_down; | 742 | port_agent->link_down_handler = scic_sds_mpc_agent_link_down; |
@@ -766,7 +744,7 @@ enum sci_status scic_sds_port_configuration_agent_initialize( | |||
766 | sci_init_timer(&port_agent->timer, mpc_agent_timeout); | 744 | sci_init_timer(&port_agent->timer, mpc_agent_timeout); |
767 | } else { | 745 | } else { |
768 | status = scic_sds_apc_agent_validate_phy_configuration( | 746 | status = scic_sds_apc_agent_validate_phy_configuration( |
769 | scic, port_agent); | 747 | ihost, port_agent); |
770 | 748 | ||
771 | port_agent->link_up_handler = scic_sds_apc_agent_link_up; | 749 | port_agent->link_up_handler = scic_sds_apc_agent_link_up; |
772 | port_agent->link_down_handler = scic_sds_apc_agent_link_down; | 750 | port_agent->link_down_handler = scic_sds_apc_agent_link_down; |
diff --git a/drivers/scsi/isci/probe_roms.h b/drivers/scsi/isci/probe_roms.h index 95c8d91aab8d..e40cb5f6eba5 100644 --- a/drivers/scsi/isci/probe_roms.h +++ b/drivers/scsi/isci/probe_roms.h | |||
@@ -165,7 +165,7 @@ struct scic_sds_oem_params; | |||
165 | int scic_oem_parameters_validate(struct scic_sds_oem_params *oem); | 165 | int scic_oem_parameters_validate(struct scic_sds_oem_params *oem); |
166 | 166 | ||
167 | union scic_oem_parameters; | 167 | union scic_oem_parameters; |
168 | void scic_oem_parameters_get(struct scic_sds_controller *scic, | 168 | void scic_oem_parameters_get(struct isci_host *ihost, |
169 | union scic_oem_parameters *oem); | 169 | union scic_oem_parameters *oem); |
170 | 170 | ||
171 | struct isci_orom; | 171 | struct isci_orom; |
diff --git a/drivers/scsi/isci/remote_device.c b/drivers/scsi/isci/remote_device.c index 3b0234049a3d..9043b458c999 100644 --- a/drivers/scsi/isci/remote_device.c +++ b/drivers/scsi/isci/remote_device.c | |||
@@ -62,7 +62,7 @@ | |||
62 | #include "task.h" | 62 | #include "task.h" |
63 | 63 | ||
64 | /** | 64 | /** |
65 | * isci_remote_device_not_ready() - This function is called by the scic when | 65 | * isci_remote_device_not_ready() - This function is called by the ihost when |
66 | * the remote device is not ready. We mark the isci device as ready (not | 66 | * the remote device is not ready. We mark the isci device as ready (not |
67 | * "ready_for_io") and signal the waiting proccess. | 67 | * "ready_for_io") and signal the waiting proccess. |
68 | * @isci_host: This parameter specifies the isci host object. | 68 | * @isci_host: This parameter specifies the isci host object. |
@@ -92,7 +92,7 @@ static void isci_remote_device_not_ready(struct isci_host *ihost, | |||
92 | "%s: isci_device = %p request = %p\n", | 92 | "%s: isci_device = %p request = %p\n", |
93 | __func__, idev, ireq); | 93 | __func__, idev, ireq); |
94 | 94 | ||
95 | scic_controller_terminate_request(&ihost->sci, | 95 | scic_controller_terminate_request(ihost, |
96 | idev, | 96 | idev, |
97 | ireq); | 97 | ireq); |
98 | } | 98 | } |
@@ -104,7 +104,7 @@ static void isci_remote_device_not_ready(struct isci_host *ihost, | |||
104 | } | 104 | } |
105 | 105 | ||
106 | /** | 106 | /** |
107 | * isci_remote_device_ready() - This function is called by the scic when the | 107 | * isci_remote_device_ready() - This function is called by the ihost when the |
108 | * remote device is ready. We mark the isci device as ready and signal the | 108 | * remote device is ready. We mark the isci device as ready and signal the |
109 | * waiting proccess. | 109 | * waiting proccess. |
110 | * @ihost: our valid isci_host | 110 | * @ihost: our valid isci_host |
@@ -135,8 +135,7 @@ static void rnc_destruct_done(void *_dev) | |||
135 | 135 | ||
136 | static enum sci_status scic_sds_remote_device_terminate_requests(struct isci_remote_device *idev) | 136 | static enum sci_status scic_sds_remote_device_terminate_requests(struct isci_remote_device *idev) |
137 | { | 137 | { |
138 | struct scic_sds_controller *scic = idev->owning_port->owning_controller; | 138 | struct isci_host *ihost = idev->owning_port->owning_controller; |
139 | struct isci_host *ihost = scic_to_ihost(scic); | ||
140 | enum sci_status status = SCI_SUCCESS; | 139 | enum sci_status status = SCI_SUCCESS; |
141 | u32 i; | 140 | u32 i; |
142 | 141 | ||
@@ -148,7 +147,7 @@ static enum sci_status scic_sds_remote_device_terminate_requests(struct isci_rem | |||
148 | ireq->target_device != idev) | 147 | ireq->target_device != idev) |
149 | continue; | 148 | continue; |
150 | 149 | ||
151 | s = scic_controller_terminate_request(scic, idev, ireq); | 150 | s = scic_controller_terminate_request(ihost, idev, ireq); |
152 | if (s != SCI_SUCCESS) | 151 | if (s != SCI_SUCCESS) |
153 | status = s; | 152 | status = s; |
154 | } | 153 | } |
@@ -276,7 +275,7 @@ enum sci_status scic_sds_remote_device_frame_handler(struct isci_remote_device * | |||
276 | { | 275 | { |
277 | struct sci_base_state_machine *sm = &idev->sm; | 276 | struct sci_base_state_machine *sm = &idev->sm; |
278 | enum scic_sds_remote_device_states state = sm->current_state_id; | 277 | enum scic_sds_remote_device_states state = sm->current_state_id; |
279 | struct scic_sds_controller *scic = idev->owning_port->owning_controller; | 278 | struct isci_host *ihost = idev->owning_port->owning_controller; |
280 | enum sci_status status; | 279 | enum sci_status status; |
281 | 280 | ||
282 | switch (state) { | 281 | switch (state) { |
@@ -290,7 +289,7 @@ enum sci_status scic_sds_remote_device_frame_handler(struct isci_remote_device * | |||
290 | dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", | 289 | dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", |
291 | __func__, state); | 290 | __func__, state); |
292 | /* Return the frame back to the controller */ | 291 | /* Return the frame back to the controller */ |
293 | scic_sds_controller_release_frame(scic, frame_index); | 292 | scic_sds_controller_release_frame(ihost, frame_index); |
294 | return SCI_FAILURE_INVALID_STATE; | 293 | return SCI_FAILURE_INVALID_STATE; |
295 | case SCI_DEV_READY: | 294 | case SCI_DEV_READY: |
296 | case SCI_STP_DEV_NCQ_ERROR: | 295 | case SCI_STP_DEV_NCQ_ERROR: |
@@ -303,7 +302,7 @@ enum sci_status scic_sds_remote_device_frame_handler(struct isci_remote_device * | |||
303 | void *frame_header; | 302 | void *frame_header; |
304 | ssize_t word_cnt; | 303 | ssize_t word_cnt; |
305 | 304 | ||
306 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 305 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
307 | frame_index, | 306 | frame_index, |
308 | &frame_header); | 307 | &frame_header); |
309 | if (status != SCI_SUCCESS) | 308 | if (status != SCI_SUCCESS) |
@@ -312,7 +311,7 @@ enum sci_status scic_sds_remote_device_frame_handler(struct isci_remote_device * | |||
312 | word_cnt = sizeof(hdr) / sizeof(u32); | 311 | word_cnt = sizeof(hdr) / sizeof(u32); |
313 | sci_swab32_cpy(&hdr, frame_header, word_cnt); | 312 | sci_swab32_cpy(&hdr, frame_header, word_cnt); |
314 | 313 | ||
315 | ireq = scic_request_by_tag(scic, be16_to_cpu(hdr.tag)); | 314 | ireq = scic_request_by_tag(ihost, be16_to_cpu(hdr.tag)); |
316 | if (ireq && ireq->target_device == idev) { | 315 | if (ireq && ireq->target_device == idev) { |
317 | /* The IO request is now in charge of releasing the frame */ | 316 | /* The IO request is now in charge of releasing the frame */ |
318 | status = scic_sds_io_request_frame_handler(ireq, frame_index); | 317 | status = scic_sds_io_request_frame_handler(ireq, frame_index); |
@@ -320,14 +319,14 @@ enum sci_status scic_sds_remote_device_frame_handler(struct isci_remote_device * | |||
320 | /* We could not map this tag to a valid IO | 319 | /* We could not map this tag to a valid IO |
321 | * request Just toss the frame and continue | 320 | * request Just toss the frame and continue |
322 | */ | 321 | */ |
323 | scic_sds_controller_release_frame(scic, frame_index); | 322 | scic_sds_controller_release_frame(ihost, frame_index); |
324 | } | 323 | } |
325 | break; | 324 | break; |
326 | } | 325 | } |
327 | case SCI_STP_DEV_NCQ: { | 326 | case SCI_STP_DEV_NCQ: { |
328 | struct dev_to_host_fis *hdr; | 327 | struct dev_to_host_fis *hdr; |
329 | 328 | ||
330 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 329 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
331 | frame_index, | 330 | frame_index, |
332 | (void **)&hdr); | 331 | (void **)&hdr); |
333 | if (status != SCI_SUCCESS) | 332 | if (status != SCI_SUCCESS) |
@@ -350,7 +349,7 @@ enum sci_status scic_sds_remote_device_frame_handler(struct isci_remote_device * | |||
350 | } else | 349 | } else |
351 | status = SCI_FAILURE; | 350 | status = SCI_FAILURE; |
352 | 351 | ||
353 | scic_sds_controller_release_frame(scic, frame_index); | 352 | scic_sds_controller_release_frame(ihost, frame_index); |
354 | break; | 353 | break; |
355 | } | 354 | } |
356 | case SCI_STP_DEV_CMD: | 355 | case SCI_STP_DEV_CMD: |
@@ -461,7 +460,7 @@ static void scic_sds_remote_device_start_request(struct isci_remote_device *idev | |||
461 | } | 460 | } |
462 | } | 461 | } |
463 | 462 | ||
464 | enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic, | 463 | enum sci_status scic_sds_remote_device_start_io(struct isci_host *ihost, |
465 | struct isci_remote_device *idev, | 464 | struct isci_remote_device *idev, |
466 | struct isci_request *ireq) | 465 | struct isci_request *ireq) |
467 | { | 466 | { |
@@ -597,7 +596,7 @@ static enum sci_status common_complete_io(struct isci_port *iport, | |||
597 | return status; | 596 | return status; |
598 | } | 597 | } |
599 | 598 | ||
600 | enum sci_status scic_sds_remote_device_complete_io(struct scic_sds_controller *scic, | 599 | enum sci_status scic_sds_remote_device_complete_io(struct isci_host *ihost, |
601 | struct isci_remote_device *idev, | 600 | struct isci_remote_device *idev, |
602 | struct isci_request *ireq) | 601 | struct isci_request *ireq) |
603 | { | 602 | { |
@@ -678,7 +677,7 @@ static void scic_sds_remote_device_continue_request(void *dev) | |||
678 | scic_controller_continue_io(idev->working_request); | 677 | scic_controller_continue_io(idev->working_request); |
679 | } | 678 | } |
680 | 679 | ||
681 | enum sci_status scic_sds_remote_device_start_task(struct scic_sds_controller *scic, | 680 | enum sci_status scic_sds_remote_device_start_task(struct isci_host *ihost, |
682 | struct isci_remote_device *idev, | 681 | struct isci_remote_device *idev, |
683 | struct isci_request *ireq) | 682 | struct isci_request *ireq) |
684 | { | 683 | { |
@@ -802,13 +801,13 @@ static void remote_device_resume_done(void *_dev) | |||
802 | static void scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void *_dev) | 801 | static void scic_sds_stp_remote_device_ready_idle_substate_resume_complete_handler(void *_dev) |
803 | { | 802 | { |
804 | struct isci_remote_device *idev = _dev; | 803 | struct isci_remote_device *idev = _dev; |
805 | struct scic_sds_controller *scic = idev->owning_port->owning_controller; | 804 | struct isci_host *ihost = idev->owning_port->owning_controller; |
806 | 805 | ||
807 | /* For NCQ operation we do not issue a isci_remote_device_not_ready(). | 806 | /* For NCQ operation we do not issue a isci_remote_device_not_ready(). |
808 | * As a result, avoid sending the ready notification. | 807 | * As a result, avoid sending the ready notification. |
809 | */ | 808 | */ |
810 | if (idev->sm.previous_state_id != SCI_STP_DEV_NCQ) | 809 | if (idev->sm.previous_state_id != SCI_STP_DEV_NCQ) |
811 | isci_remote_device_ready(scic_to_ihost(scic), idev); | 810 | isci_remote_device_ready(ihost, idev); |
812 | } | 811 | } |
813 | 812 | ||
814 | static void scic_sds_remote_device_initial_state_enter(struct sci_base_state_machine *sm) | 813 | static void scic_sds_remote_device_initial_state_enter(struct sci_base_state_machine *sm) |
@@ -836,7 +835,7 @@ static enum sci_status scic_remote_device_destruct(struct isci_remote_device *id | |||
836 | { | 835 | { |
837 | struct sci_base_state_machine *sm = &idev->sm; | 836 | struct sci_base_state_machine *sm = &idev->sm; |
838 | enum scic_sds_remote_device_states state = sm->current_state_id; | 837 | enum scic_sds_remote_device_states state = sm->current_state_id; |
839 | struct scic_sds_controller *scic; | 838 | struct isci_host *ihost; |
840 | 839 | ||
841 | if (state != SCI_DEV_STOPPED) { | 840 | if (state != SCI_DEV_STOPPED) { |
842 | dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", | 841 | dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", |
@@ -844,8 +843,8 @@ static enum sci_status scic_remote_device_destruct(struct isci_remote_device *id | |||
844 | return SCI_FAILURE_INVALID_STATE; | 843 | return SCI_FAILURE_INVALID_STATE; |
845 | } | 844 | } |
846 | 845 | ||
847 | scic = idev->owning_port->owning_controller; | 846 | ihost = idev->owning_port->owning_controller; |
848 | scic_sds_controller_free_remote_node_context(scic, idev, | 847 | scic_sds_controller_free_remote_node_context(ihost, idev, |
849 | idev->rnc.remote_node_index); | 848 | idev->rnc.remote_node_index); |
850 | idev->rnc.remote_node_index = SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX; | 849 | idev->rnc.remote_node_index = SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX; |
851 | sci_change_state(sm, SCI_DEV_FINAL); | 850 | sci_change_state(sm, SCI_DEV_FINAL); |
@@ -878,7 +877,7 @@ static void isci_remote_device_deconstruct(struct isci_host *ihost, struct isci_ | |||
878 | static void scic_sds_remote_device_stopped_state_enter(struct sci_base_state_machine *sm) | 877 | static void scic_sds_remote_device_stopped_state_enter(struct sci_base_state_machine *sm) |
879 | { | 878 | { |
880 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 879 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
881 | struct scic_sds_controller *scic = idev->owning_port->owning_controller; | 880 | struct isci_host *ihost = idev->owning_port->owning_controller; |
882 | u32 prev_state; | 881 | u32 prev_state; |
883 | 882 | ||
884 | /* If we are entering from the stopping state let the SCI User know that | 883 | /* If we are entering from the stopping state let the SCI User know that |
@@ -886,16 +885,15 @@ static void scic_sds_remote_device_stopped_state_enter(struct sci_base_state_mac | |||
886 | */ | 885 | */ |
887 | prev_state = idev->sm.previous_state_id; | 886 | prev_state = idev->sm.previous_state_id; |
888 | if (prev_state == SCI_DEV_STOPPING) | 887 | if (prev_state == SCI_DEV_STOPPING) |
889 | isci_remote_device_deconstruct(scic_to_ihost(scic), idev); | 888 | isci_remote_device_deconstruct(ihost, idev); |
890 | 889 | ||
891 | scic_sds_controller_remote_device_stopped(scic, idev); | 890 | scic_sds_controller_remote_device_stopped(ihost, idev); |
892 | } | 891 | } |
893 | 892 | ||
894 | static void scic_sds_remote_device_starting_state_enter(struct sci_base_state_machine *sm) | 893 | static void scic_sds_remote_device_starting_state_enter(struct sci_base_state_machine *sm) |
895 | { | 894 | { |
896 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 895 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
897 | struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(idev); | 896 | struct isci_host *ihost = scic_sds_remote_device_get_controller(idev); |
898 | struct isci_host *ihost = scic_to_ihost(scic); | ||
899 | 897 | ||
900 | isci_remote_device_not_ready(ihost, idev, | 898 | isci_remote_device_not_ready(ihost, idev, |
901 | SCIC_REMOTE_DEVICE_NOT_READY_START_REQUESTED); | 899 | SCIC_REMOTE_DEVICE_NOT_READY_START_REQUESTED); |
@@ -904,7 +902,7 @@ static void scic_sds_remote_device_starting_state_enter(struct sci_base_state_ma | |||
904 | static void scic_sds_remote_device_ready_state_enter(struct sci_base_state_machine *sm) | 902 | static void scic_sds_remote_device_ready_state_enter(struct sci_base_state_machine *sm) |
905 | { | 903 | { |
906 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 904 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
907 | struct scic_sds_controller *scic = idev->owning_port->owning_controller; | 905 | struct isci_host *ihost = idev->owning_port->owning_controller; |
908 | struct domain_device *dev = idev->domain_dev; | 906 | struct domain_device *dev = idev->domain_dev; |
909 | 907 | ||
910 | if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_SATA)) { | 908 | if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_SATA)) { |
@@ -912,7 +910,7 @@ static void scic_sds_remote_device_ready_state_enter(struct sci_base_state_machi | |||
912 | } else if (dev_is_expander(dev)) { | 910 | } else if (dev_is_expander(dev)) { |
913 | sci_change_state(&idev->sm, SCI_SMP_DEV_IDLE); | 911 | sci_change_state(&idev->sm, SCI_SMP_DEV_IDLE); |
914 | } else | 912 | } else |
915 | isci_remote_device_ready(scic_to_ihost(scic), idev); | 913 | isci_remote_device_ready(ihost, idev); |
916 | } | 914 | } |
917 | 915 | ||
918 | static void scic_sds_remote_device_ready_state_exit(struct sci_base_state_machine *sm) | 916 | static void scic_sds_remote_device_ready_state_exit(struct sci_base_state_machine *sm) |
@@ -921,9 +919,9 @@ static void scic_sds_remote_device_ready_state_exit(struct sci_base_state_machin | |||
921 | struct domain_device *dev = idev->domain_dev; | 919 | struct domain_device *dev = idev->domain_dev; |
922 | 920 | ||
923 | if (dev->dev_type == SAS_END_DEV) { | 921 | if (dev->dev_type == SAS_END_DEV) { |
924 | struct scic_sds_controller *scic = idev->owning_port->owning_controller; | 922 | struct isci_host *ihost = idev->owning_port->owning_controller; |
925 | 923 | ||
926 | isci_remote_device_not_ready(scic_to_ihost(scic), idev, | 924 | isci_remote_device_not_ready(ihost, idev, |
927 | SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED); | 925 | SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED); |
928 | } | 926 | } |
929 | } | 927 | } |
@@ -963,40 +961,40 @@ static void scic_sds_stp_remote_device_ready_idle_substate_enter(struct sci_base | |||
963 | static void scic_sds_stp_remote_device_ready_cmd_substate_enter(struct sci_base_state_machine *sm) | 961 | static void scic_sds_stp_remote_device_ready_cmd_substate_enter(struct sci_base_state_machine *sm) |
964 | { | 962 | { |
965 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 963 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
966 | struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(idev); | 964 | struct isci_host *ihost = scic_sds_remote_device_get_controller(idev); |
967 | 965 | ||
968 | BUG_ON(idev->working_request == NULL); | 966 | BUG_ON(idev->working_request == NULL); |
969 | 967 | ||
970 | isci_remote_device_not_ready(scic_to_ihost(scic), idev, | 968 | isci_remote_device_not_ready(ihost, idev, |
971 | SCIC_REMOTE_DEVICE_NOT_READY_SATA_REQUEST_STARTED); | 969 | SCIC_REMOTE_DEVICE_NOT_READY_SATA_REQUEST_STARTED); |
972 | } | 970 | } |
973 | 971 | ||
974 | static void scic_sds_stp_remote_device_ready_ncq_error_substate_enter(struct sci_base_state_machine *sm) | 972 | static void scic_sds_stp_remote_device_ready_ncq_error_substate_enter(struct sci_base_state_machine *sm) |
975 | { | 973 | { |
976 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 974 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
977 | struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(idev); | 975 | struct isci_host *ihost = scic_sds_remote_device_get_controller(idev); |
978 | 976 | ||
979 | if (idev->not_ready_reason == SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED) | 977 | if (idev->not_ready_reason == SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED) |
980 | isci_remote_device_not_ready(scic_to_ihost(scic), idev, | 978 | isci_remote_device_not_ready(ihost, idev, |
981 | idev->not_ready_reason); | 979 | idev->not_ready_reason); |
982 | } | 980 | } |
983 | 981 | ||
984 | static void scic_sds_smp_remote_device_ready_idle_substate_enter(struct sci_base_state_machine *sm) | 982 | static void scic_sds_smp_remote_device_ready_idle_substate_enter(struct sci_base_state_machine *sm) |
985 | { | 983 | { |
986 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 984 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
987 | struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(idev); | 985 | struct isci_host *ihost = scic_sds_remote_device_get_controller(idev); |
988 | 986 | ||
989 | isci_remote_device_ready(scic_to_ihost(scic), idev); | 987 | isci_remote_device_ready(ihost, idev); |
990 | } | 988 | } |
991 | 989 | ||
992 | static void scic_sds_smp_remote_device_ready_cmd_substate_enter(struct sci_base_state_machine *sm) | 990 | static void scic_sds_smp_remote_device_ready_cmd_substate_enter(struct sci_base_state_machine *sm) |
993 | { | 991 | { |
994 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); | 992 | struct isci_remote_device *idev = container_of(sm, typeof(*idev), sm); |
995 | struct scic_sds_controller *scic = scic_sds_remote_device_get_controller(idev); | 993 | struct isci_host *ihost = scic_sds_remote_device_get_controller(idev); |
996 | 994 | ||
997 | BUG_ON(idev->working_request == NULL); | 995 | BUG_ON(idev->working_request == NULL); |
998 | 996 | ||
999 | isci_remote_device_not_ready(scic_to_ihost(scic), idev, | 997 | isci_remote_device_not_ready(ihost, idev, |
1000 | SCIC_REMOTE_DEVICE_NOT_READY_SMP_REQUEST_STARTED); | 998 | SCIC_REMOTE_DEVICE_NOT_READY_SMP_REQUEST_STARTED); |
1001 | } | 999 | } |
1002 | 1000 | ||
@@ -1303,7 +1301,7 @@ void isci_remote_device_release(struct kref *kref) | |||
1303 | * @isci_host: This parameter specifies the isci host object. | 1301 | * @isci_host: This parameter specifies the isci host object. |
1304 | * @isci_device: This parameter specifies the remote device. | 1302 | * @isci_device: This parameter specifies the remote device. |
1305 | * | 1303 | * |
1306 | * The status of the scic request to stop. | 1304 | * The status of the ihost request to stop. |
1307 | */ | 1305 | */ |
1308 | enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_remote_device *idev) | 1306 | enum sci_status isci_remote_device_stop(struct isci_host *ihost, struct isci_remote_device *idev) |
1309 | { | 1307 | { |
diff --git a/drivers/scsi/isci/remote_device.h b/drivers/scsi/isci/remote_device.h index 45798582fc14..bc4da20a13fa 100644 --- a/drivers/scsi/isci/remote_device.h +++ b/drivers/scsi/isci/remote_device.h | |||
@@ -402,17 +402,17 @@ enum sci_status scic_sds_remote_device_event_handler( | |||
402 | u32 event_code); | 402 | u32 event_code); |
403 | 403 | ||
404 | enum sci_status scic_sds_remote_device_start_io( | 404 | enum sci_status scic_sds_remote_device_start_io( |
405 | struct scic_sds_controller *controller, | 405 | struct isci_host *ihost, |
406 | struct isci_remote_device *idev, | 406 | struct isci_remote_device *idev, |
407 | struct isci_request *ireq); | 407 | struct isci_request *ireq); |
408 | 408 | ||
409 | enum sci_status scic_sds_remote_device_start_task( | 409 | enum sci_status scic_sds_remote_device_start_task( |
410 | struct scic_sds_controller *controller, | 410 | struct isci_host *ihost, |
411 | struct isci_remote_device *idev, | 411 | struct isci_remote_device *idev, |
412 | struct isci_request *ireq); | 412 | struct isci_request *ireq); |
413 | 413 | ||
414 | enum sci_status scic_sds_remote_device_complete_io( | 414 | enum sci_status scic_sds_remote_device_complete_io( |
415 | struct scic_sds_controller *controller, | 415 | struct isci_host *ihost, |
416 | struct isci_remote_device *idev, | 416 | struct isci_remote_device *idev, |
417 | struct isci_request *ireq); | 417 | struct isci_request *ireq); |
418 | 418 | ||
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c index e485744e1263..8a5203b6eb09 100644 --- a/drivers/scsi/isci/remote_node_context.c +++ b/drivers/scsi/isci/remote_node_context.c | |||
@@ -107,11 +107,11 @@ static void scic_sds_remote_node_context_construct_buffer( | |||
107 | struct domain_device *dev = idev->domain_dev; | 107 | struct domain_device *dev = idev->domain_dev; |
108 | int rni = sci_rnc->remote_node_index; | 108 | int rni = sci_rnc->remote_node_index; |
109 | union scu_remote_node_context *rnc; | 109 | union scu_remote_node_context *rnc; |
110 | struct scic_sds_controller *scic; | 110 | struct isci_host *ihost; |
111 | __le64 sas_addr; | 111 | __le64 sas_addr; |
112 | 112 | ||
113 | scic = scic_sds_remote_device_get_controller(idev); | 113 | ihost = scic_sds_remote_device_get_controller(idev); |
114 | rnc = scic_sds_controller_get_remote_node_context_buffer(scic, rni); | 114 | rnc = scic_sds_controller_get_remote_node_context_buffer(ihost, rni); |
115 | 115 | ||
116 | memset(rnc, 0, sizeof(union scu_remote_node_context) | 116 | memset(rnc, 0, sizeof(union scu_remote_node_context) |
117 | * scic_sds_remote_device_node_count(idev)); | 117 | * scic_sds_remote_device_node_count(idev)); |
@@ -135,14 +135,14 @@ static void scic_sds_remote_node_context_construct_buffer( | |||
135 | 135 | ||
136 | if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { | 136 | if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
137 | rnc->ssp.connection_occupancy_timeout = | 137 | rnc->ssp.connection_occupancy_timeout = |
138 | scic->user_parameters.sds1.stp_max_occupancy_timeout; | 138 | ihost->user_parameters.sds1.stp_max_occupancy_timeout; |
139 | rnc->ssp.connection_inactivity_timeout = | 139 | rnc->ssp.connection_inactivity_timeout = |
140 | scic->user_parameters.sds1.stp_inactivity_timeout; | 140 | ihost->user_parameters.sds1.stp_inactivity_timeout; |
141 | } else { | 141 | } else { |
142 | rnc->ssp.connection_occupancy_timeout = | 142 | rnc->ssp.connection_occupancy_timeout = |
143 | scic->user_parameters.sds1.ssp_max_occupancy_timeout; | 143 | ihost->user_parameters.sds1.ssp_max_occupancy_timeout; |
144 | rnc->ssp.connection_inactivity_timeout = | 144 | rnc->ssp.connection_inactivity_timeout = |
145 | scic->user_parameters.sds1.ssp_inactivity_timeout; | 145 | ihost->user_parameters.sds1.ssp_inactivity_timeout; |
146 | } | 146 | } |
147 | 147 | ||
148 | rnc->ssp.initial_arbitration_wait_time = 0; | 148 | rnc->ssp.initial_arbitration_wait_time = 0; |
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c index 90ead662828d..36e674896bc5 100644 --- a/drivers/scsi/isci/request.c +++ b/drivers/scsi/isci/request.c | |||
@@ -74,19 +74,19 @@ static struct scu_sgl_element_pair *to_sgl_element_pair(struct isci_request *ire | |||
74 | return &ireq->sg_table[idx - 2]; | 74 | return &ireq->sg_table[idx - 2]; |
75 | } | 75 | } |
76 | 76 | ||
77 | static dma_addr_t to_sgl_element_pair_dma(struct scic_sds_controller *scic, | 77 | static dma_addr_t to_sgl_element_pair_dma(struct isci_host *ihost, |
78 | struct isci_request *ireq, u32 idx) | 78 | struct isci_request *ireq, u32 idx) |
79 | { | 79 | { |
80 | u32 offset; | 80 | u32 offset; |
81 | 81 | ||
82 | if (idx == 0) { | 82 | if (idx == 0) { |
83 | offset = (void *) &ireq->tc->sgl_pair_ab - | 83 | offset = (void *) &ireq->tc->sgl_pair_ab - |
84 | (void *) &scic->task_context_table[0]; | 84 | (void *) &ihost->task_context_table[0]; |
85 | return scic->task_context_dma + offset; | 85 | return ihost->task_context_dma + offset; |
86 | } else if (idx == 1) { | 86 | } else if (idx == 1) { |
87 | offset = (void *) &ireq->tc->sgl_pair_cd - | 87 | offset = (void *) &ireq->tc->sgl_pair_cd - |
88 | (void *) &scic->task_context_table[0]; | 88 | (void *) &ihost->task_context_table[0]; |
89 | return scic->task_context_dma + offset; | 89 | return ihost->task_context_dma + offset; |
90 | } | 90 | } |
91 | 91 | ||
92 | return scic_io_request_get_dma_addr(ireq, &ireq->sg_table[idx - 2]); | 92 | return scic_io_request_get_dma_addr(ireq, &ireq->sg_table[idx - 2]); |
@@ -102,8 +102,7 @@ static void init_sgl_element(struct scu_sgl_element *e, struct scatterlist *sg) | |||
102 | 102 | ||
103 | static void scic_sds_request_build_sgl(struct isci_request *ireq) | 103 | static void scic_sds_request_build_sgl(struct isci_request *ireq) |
104 | { | 104 | { |
105 | struct isci_host *isci_host = ireq->isci_host; | 105 | struct isci_host *ihost = ireq->isci_host; |
106 | struct scic_sds_controller *scic = &isci_host->sci; | ||
107 | struct sas_task *task = isci_request_access_task(ireq); | 106 | struct sas_task *task = isci_request_access_task(ireq); |
108 | struct scatterlist *sg = NULL; | 107 | struct scatterlist *sg = NULL; |
109 | dma_addr_t dma_addr; | 108 | dma_addr_t dma_addr; |
@@ -125,7 +124,7 @@ static void scic_sds_request_build_sgl(struct isci_request *ireq) | |||
125 | memset(&scu_sg->B, 0, sizeof(scu_sg->B)); | 124 | memset(&scu_sg->B, 0, sizeof(scu_sg->B)); |
126 | 125 | ||
127 | if (prev_sg) { | 126 | if (prev_sg) { |
128 | dma_addr = to_sgl_element_pair_dma(scic, | 127 | dma_addr = to_sgl_element_pair_dma(ihost, |
129 | ireq, | 128 | ireq, |
130 | sg_idx); | 129 | sg_idx); |
131 | 130 | ||
@@ -141,7 +140,7 @@ static void scic_sds_request_build_sgl(struct isci_request *ireq) | |||
141 | } else { /* handle when no sg */ | 140 | } else { /* handle when no sg */ |
142 | scu_sg = to_sgl_element_pair(ireq, sg_idx); | 141 | scu_sg = to_sgl_element_pair(ireq, sg_idx); |
143 | 142 | ||
144 | dma_addr = dma_map_single(&isci_host->pdev->dev, | 143 | dma_addr = dma_map_single(&ihost->pdev->dev, |
145 | task->scatter, | 144 | task->scatter, |
146 | task->total_xfer_len, | 145 | task->total_xfer_len, |
147 | task->data_dir); | 146 | task->data_dir); |
@@ -508,7 +507,7 @@ scic_io_request_construct_sata(struct isci_request *ireq, | |||
508 | scu_stp_raw_request_construct_task_context(ireq); | 507 | scu_stp_raw_request_construct_task_context(ireq); |
509 | return SCI_SUCCESS; | 508 | return SCI_SUCCESS; |
510 | } else { | 509 | } else { |
511 | dev_err(scic_to_dev(ireq->owning_controller), | 510 | dev_err(&ireq->owning_controller->pdev->dev, |
512 | "%s: Request 0x%p received un-handled SAT " | 511 | "%s: Request 0x%p received un-handled SAT " |
513 | "management protocol 0x%x.\n", | 512 | "management protocol 0x%x.\n", |
514 | __func__, ireq, tmf->tmf_code); | 513 | __func__, ireq, tmf->tmf_code); |
@@ -518,7 +517,7 @@ scic_io_request_construct_sata(struct isci_request *ireq, | |||
518 | } | 517 | } |
519 | 518 | ||
520 | if (!sas_protocol_ata(task->task_proto)) { | 519 | if (!sas_protocol_ata(task->task_proto)) { |
521 | dev_err(scic_to_dev(ireq->owning_controller), | 520 | dev_err(&ireq->owning_controller->pdev->dev, |
522 | "%s: Non-ATA protocol in SATA path: 0x%x\n", | 521 | "%s: Non-ATA protocol in SATA path: 0x%x\n", |
523 | __func__, | 522 | __func__, |
524 | task->task_proto); | 523 | task->task_proto); |
@@ -616,7 +615,7 @@ enum sci_status scic_task_request_construct_sata(struct isci_request *ireq) | |||
616 | tmf->tmf_code == isci_tmf_sata_srst_low) { | 615 | tmf->tmf_code == isci_tmf_sata_srst_low) { |
617 | scu_stp_raw_request_construct_task_context(ireq); | 616 | scu_stp_raw_request_construct_task_context(ireq); |
618 | } else { | 617 | } else { |
619 | dev_err(scic_to_dev(ireq->owning_controller), | 618 | dev_err(&ireq->owning_controller->pdev->dev, |
620 | "%s: Request 0x%p received un-handled SAT " | 619 | "%s: Request 0x%p received un-handled SAT " |
621 | "Protocol 0x%x.\n", | 620 | "Protocol 0x%x.\n", |
622 | __func__, ireq, tmf->tmf_code); | 621 | __func__, ireq, tmf->tmf_code); |
@@ -639,11 +638,11 @@ enum sci_status scic_task_request_construct_sata(struct isci_request *ireq) | |||
639 | #define SCU_TASK_CONTEXT_SRAM 0x200000 | 638 | #define SCU_TASK_CONTEXT_SRAM 0x200000 |
640 | static u32 sci_req_tx_bytes(struct isci_request *ireq) | 639 | static u32 sci_req_tx_bytes(struct isci_request *ireq) |
641 | { | 640 | { |
642 | struct scic_sds_controller *scic = ireq->owning_controller; | 641 | struct isci_host *ihost = ireq->owning_controller; |
643 | u32 ret_val = 0; | 642 | u32 ret_val = 0; |
644 | 643 | ||
645 | if (readl(&scic->smu_registers->address_modifier) == 0) { | 644 | if (readl(&ihost->smu_registers->address_modifier) == 0) { |
646 | void __iomem *scu_reg_base = scic->scu_registers; | 645 | void __iomem *scu_reg_base = ihost->scu_registers; |
647 | 646 | ||
648 | /* get the bytes of data from the Address == BAR1 + 20002Ch + (256*TCi) where | 647 | /* get the bytes of data from the Address == BAR1 + 20002Ch + (256*TCi) where |
649 | * BAR1 is the scu_registers | 648 | * BAR1 is the scu_registers |
@@ -663,11 +662,11 @@ enum sci_status scic_sds_request_start(struct isci_request *ireq) | |||
663 | { | 662 | { |
664 | enum sci_base_request_states state; | 663 | enum sci_base_request_states state; |
665 | struct scu_task_context *tc = ireq->tc; | 664 | struct scu_task_context *tc = ireq->tc; |
666 | struct scic_sds_controller *scic = ireq->owning_controller; | 665 | struct isci_host *ihost = ireq->owning_controller; |
667 | 666 | ||
668 | state = ireq->sm.current_state_id; | 667 | state = ireq->sm.current_state_id; |
669 | if (state != SCI_REQ_CONSTRUCTED) { | 668 | if (state != SCI_REQ_CONSTRUCTED) { |
670 | dev_warn(scic_to_dev(scic), | 669 | dev_warn(&ihost->pdev->dev, |
671 | "%s: SCIC IO Request requested to start while in wrong " | 670 | "%s: SCIC IO Request requested to start while in wrong " |
672 | "state %d\n", __func__, state); | 671 | "state %d\n", __func__, state); |
673 | return SCI_FAILURE_INVALID_STATE; | 672 | return SCI_FAILURE_INVALID_STATE; |
@@ -749,7 +748,7 @@ scic_sds_io_request_terminate(struct isci_request *ireq) | |||
749 | return SCI_SUCCESS; | 748 | return SCI_SUCCESS; |
750 | case SCI_REQ_COMPLETED: | 749 | case SCI_REQ_COMPLETED: |
751 | default: | 750 | default: |
752 | dev_warn(scic_to_dev(ireq->owning_controller), | 751 | dev_warn(&ireq->owning_controller->pdev->dev, |
753 | "%s: SCIC IO Request requested to abort while in wrong " | 752 | "%s: SCIC IO Request requested to abort while in wrong " |
754 | "state %d\n", | 753 | "state %d\n", |
755 | __func__, | 754 | __func__, |
@@ -763,7 +762,7 @@ scic_sds_io_request_terminate(struct isci_request *ireq) | |||
763 | enum sci_status scic_sds_request_complete(struct isci_request *ireq) | 762 | enum sci_status scic_sds_request_complete(struct isci_request *ireq) |
764 | { | 763 | { |
765 | enum sci_base_request_states state; | 764 | enum sci_base_request_states state; |
766 | struct scic_sds_controller *scic = ireq->owning_controller; | 765 | struct isci_host *ihost = ireq->owning_controller; |
767 | 766 | ||
768 | state = ireq->sm.current_state_id; | 767 | state = ireq->sm.current_state_id; |
769 | if (WARN_ONCE(state != SCI_REQ_COMPLETED, | 768 | if (WARN_ONCE(state != SCI_REQ_COMPLETED, |
@@ -771,7 +770,7 @@ enum sci_status scic_sds_request_complete(struct isci_request *ireq) | |||
771 | return SCI_FAILURE_INVALID_STATE; | 770 | return SCI_FAILURE_INVALID_STATE; |
772 | 771 | ||
773 | if (ireq->saved_rx_frame_index != SCU_INVALID_FRAME_INDEX) | 772 | if (ireq->saved_rx_frame_index != SCU_INVALID_FRAME_INDEX) |
774 | scic_sds_controller_release_frame(scic, | 773 | scic_sds_controller_release_frame(ihost, |
775 | ireq->saved_rx_frame_index); | 774 | ireq->saved_rx_frame_index); |
776 | 775 | ||
777 | /* XXX can we just stop the machine and remove the 'final' state? */ | 776 | /* XXX can we just stop the machine and remove the 'final' state? */ |
@@ -783,12 +782,12 @@ enum sci_status scic_sds_io_request_event_handler(struct isci_request *ireq, | |||
783 | u32 event_code) | 782 | u32 event_code) |
784 | { | 783 | { |
785 | enum sci_base_request_states state; | 784 | enum sci_base_request_states state; |
786 | struct scic_sds_controller *scic = ireq->owning_controller; | 785 | struct isci_host *ihost = ireq->owning_controller; |
787 | 786 | ||
788 | state = ireq->sm.current_state_id; | 787 | state = ireq->sm.current_state_id; |
789 | 788 | ||
790 | if (state != SCI_REQ_STP_PIO_DATA_IN) { | 789 | if (state != SCI_REQ_STP_PIO_DATA_IN) { |
791 | dev_warn(scic_to_dev(scic), "%s: (%x) in wrong state %d\n", | 790 | dev_warn(&ihost->pdev->dev, "%s: (%x) in wrong state %d\n", |
792 | __func__, event_code, state); | 791 | __func__, event_code, state); |
793 | 792 | ||
794 | return SCI_FAILURE_INVALID_STATE; | 793 | return SCI_FAILURE_INVALID_STATE; |
@@ -802,7 +801,7 @@ enum sci_status scic_sds_io_request_event_handler(struct isci_request *ireq, | |||
802 | sci_change_state(&ireq->sm, SCI_REQ_STP_PIO_WAIT_FRAME); | 801 | sci_change_state(&ireq->sm, SCI_REQ_STP_PIO_WAIT_FRAME); |
803 | return SCI_SUCCESS; | 802 | return SCI_SUCCESS; |
804 | default: | 803 | default: |
805 | dev_err(scic_to_dev(scic), | 804 | dev_err(&ihost->pdev->dev, |
806 | "%s: pio request unexpected event %#x\n", | 805 | "%s: pio request unexpected event %#x\n", |
807 | __func__, event_code); | 806 | __func__, event_code); |
808 | 807 | ||
@@ -1024,7 +1023,7 @@ static enum sci_status ssp_task_request_await_tc_event(struct isci_request *ireq | |||
1024 | * There is a potential for receiving multiple task responses if | 1023 | * There is a potential for receiving multiple task responses if |
1025 | * we decide to send the task IU again. | 1024 | * we decide to send the task IU again. |
1026 | */ | 1025 | */ |
1027 | dev_warn(scic_to_dev(ireq->owning_controller), | 1026 | dev_warn(&ireq->owning_controller->pdev->dev, |
1028 | "%s: TaskRequest:0x%p CompletionCode:%x - " | 1027 | "%s: TaskRequest:0x%p CompletionCode:%x - " |
1029 | "ACK/NAK timeout\n", __func__, ireq, | 1028 | "ACK/NAK timeout\n", __func__, ireq, |
1030 | completion_code); | 1029 | completion_code); |
@@ -1073,7 +1072,7 @@ smp_request_await_response_tc_event(struct isci_request *ireq, | |||
1073 | * response within 2 ms. This causes our hardware break | 1072 | * response within 2 ms. This causes our hardware break |
1074 | * the connection and set TC completion with one of | 1073 | * the connection and set TC completion with one of |
1075 | * these SMP_XXX_XX_ERR status. For these type of error, | 1074 | * these SMP_XXX_XX_ERR status. For these type of error, |
1076 | * we ask scic user to retry the request. | 1075 | * we ask ihost user to retry the request. |
1077 | */ | 1076 | */ |
1078 | scic_sds_request_set_status(ireq, SCU_TASK_DONE_SMP_RESP_TO_ERR, | 1077 | scic_sds_request_set_status(ireq, SCU_TASK_DONE_SMP_RESP_TO_ERR, |
1079 | SCI_FAILURE_RETRY_REQUIRED); | 1078 | SCI_FAILURE_RETRY_REQUIRED); |
@@ -1451,18 +1450,18 @@ static void scic_sds_stp_request_udma_complete_request( | |||
1451 | static enum sci_status scic_sds_stp_request_udma_general_frame_handler(struct isci_request *ireq, | 1450 | static enum sci_status scic_sds_stp_request_udma_general_frame_handler(struct isci_request *ireq, |
1452 | u32 frame_index) | 1451 | u32 frame_index) |
1453 | { | 1452 | { |
1454 | struct scic_sds_controller *scic = ireq->owning_controller; | 1453 | struct isci_host *ihost = ireq->owning_controller; |
1455 | struct dev_to_host_fis *frame_header; | 1454 | struct dev_to_host_fis *frame_header; |
1456 | enum sci_status status; | 1455 | enum sci_status status; |
1457 | u32 *frame_buffer; | 1456 | u32 *frame_buffer; |
1458 | 1457 | ||
1459 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1458 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1460 | frame_index, | 1459 | frame_index, |
1461 | (void **)&frame_header); | 1460 | (void **)&frame_header); |
1462 | 1461 | ||
1463 | if ((status == SCI_SUCCESS) && | 1462 | if ((status == SCI_SUCCESS) && |
1464 | (frame_header->fis_type == FIS_REGD2H)) { | 1463 | (frame_header->fis_type == FIS_REGD2H)) { |
1465 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1464 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1466 | frame_index, | 1465 | frame_index, |
1467 | (void **)&frame_buffer); | 1466 | (void **)&frame_buffer); |
1468 | 1467 | ||
@@ -1471,7 +1470,7 @@ static enum sci_status scic_sds_stp_request_udma_general_frame_handler(struct is | |||
1471 | frame_buffer); | 1470 | frame_buffer); |
1472 | } | 1471 | } |
1473 | 1472 | ||
1474 | scic_sds_controller_release_frame(scic, frame_index); | 1473 | scic_sds_controller_release_frame(ihost, frame_index); |
1475 | 1474 | ||
1476 | return status; | 1475 | return status; |
1477 | } | 1476 | } |
@@ -1480,7 +1479,7 @@ enum sci_status | |||
1480 | scic_sds_io_request_frame_handler(struct isci_request *ireq, | 1479 | scic_sds_io_request_frame_handler(struct isci_request *ireq, |
1481 | u32 frame_index) | 1480 | u32 frame_index) |
1482 | { | 1481 | { |
1483 | struct scic_sds_controller *scic = ireq->owning_controller; | 1482 | struct isci_host *ihost = ireq->owning_controller; |
1484 | struct isci_stp_request *stp_req = &ireq->stp.req; | 1483 | struct isci_stp_request *stp_req = &ireq->stp.req; |
1485 | enum sci_base_request_states state; | 1484 | enum sci_base_request_states state; |
1486 | enum sci_status status; | 1485 | enum sci_status status; |
@@ -1492,7 +1491,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1492 | struct ssp_frame_hdr ssp_hdr; | 1491 | struct ssp_frame_hdr ssp_hdr; |
1493 | void *frame_header; | 1492 | void *frame_header; |
1494 | 1493 | ||
1495 | scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1494 | scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1496 | frame_index, | 1495 | frame_index, |
1497 | &frame_header); | 1496 | &frame_header); |
1498 | 1497 | ||
@@ -1503,7 +1502,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1503 | struct ssp_response_iu *resp_iu; | 1502 | struct ssp_response_iu *resp_iu; |
1504 | ssize_t word_cnt = SSP_RESP_IU_MAX_SIZE / sizeof(u32); | 1503 | ssize_t word_cnt = SSP_RESP_IU_MAX_SIZE / sizeof(u32); |
1505 | 1504 | ||
1506 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1505 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1507 | frame_index, | 1506 | frame_index, |
1508 | (void **)&resp_iu); | 1507 | (void **)&resp_iu); |
1509 | 1508 | ||
@@ -1522,7 +1521,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1522 | SCI_SUCCESS); | 1521 | SCI_SUCCESS); |
1523 | } else { | 1522 | } else { |
1524 | /* not a response frame, why did it get forwarded? */ | 1523 | /* not a response frame, why did it get forwarded? */ |
1525 | dev_err(scic_to_dev(scic), | 1524 | dev_err(&ihost->pdev->dev, |
1526 | "%s: SCIC IO Request 0x%p received unexpected " | 1525 | "%s: SCIC IO Request 0x%p received unexpected " |
1527 | "frame %d type 0x%02x\n", __func__, ireq, | 1526 | "frame %d type 0x%02x\n", __func__, ireq, |
1528 | frame_index, ssp_hdr.frame_type); | 1527 | frame_index, ssp_hdr.frame_type); |
@@ -1532,7 +1531,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1532 | * In any case we are done with this frame buffer return it to | 1531 | * In any case we are done with this frame buffer return it to |
1533 | * the controller | 1532 | * the controller |
1534 | */ | 1533 | */ |
1535 | scic_sds_controller_release_frame(scic, frame_index); | 1534 | scic_sds_controller_release_frame(ihost, frame_index); |
1536 | 1535 | ||
1537 | return SCI_SUCCESS; | 1536 | return SCI_SUCCESS; |
1538 | } | 1537 | } |
@@ -1540,14 +1539,14 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1540 | case SCI_REQ_TASK_WAIT_TC_RESP: | 1539 | case SCI_REQ_TASK_WAIT_TC_RESP: |
1541 | scic_sds_io_request_copy_response(ireq); | 1540 | scic_sds_io_request_copy_response(ireq); |
1542 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | 1541 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); |
1543 | scic_sds_controller_release_frame(scic,frame_index); | 1542 | scic_sds_controller_release_frame(ihost,frame_index); |
1544 | return SCI_SUCCESS; | 1543 | return SCI_SUCCESS; |
1545 | 1544 | ||
1546 | case SCI_REQ_SMP_WAIT_RESP: { | 1545 | case SCI_REQ_SMP_WAIT_RESP: { |
1547 | struct smp_resp *rsp_hdr = &ireq->smp.rsp; | 1546 | struct smp_resp *rsp_hdr = &ireq->smp.rsp; |
1548 | void *frame_header; | 1547 | void *frame_header; |
1549 | 1548 | ||
1550 | scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1549 | scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1551 | frame_index, | 1550 | frame_index, |
1552 | &frame_header); | 1551 | &frame_header); |
1553 | 1552 | ||
@@ -1558,7 +1557,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1558 | if (rsp_hdr->frame_type == SMP_RESPONSE) { | 1557 | if (rsp_hdr->frame_type == SMP_RESPONSE) { |
1559 | void *smp_resp; | 1558 | void *smp_resp; |
1560 | 1559 | ||
1561 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1560 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1562 | frame_index, | 1561 | frame_index, |
1563 | &smp_resp); | 1562 | &smp_resp); |
1564 | 1563 | ||
@@ -1577,7 +1576,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1577 | * This was not a response frame why did it get | 1576 | * This was not a response frame why did it get |
1578 | * forwarded? | 1577 | * forwarded? |
1579 | */ | 1578 | */ |
1580 | dev_err(scic_to_dev(scic), | 1579 | dev_err(&ihost->pdev->dev, |
1581 | "%s: SCIC SMP Request 0x%p received unexpected " | 1580 | "%s: SCIC SMP Request 0x%p received unexpected " |
1582 | "frame %d type 0x%02x\n", | 1581 | "frame %d type 0x%02x\n", |
1583 | __func__, | 1582 | __func__, |
@@ -1592,7 +1591,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1592 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | 1591 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); |
1593 | } | 1592 | } |
1594 | 1593 | ||
1595 | scic_sds_controller_release_frame(scic, frame_index); | 1594 | scic_sds_controller_release_frame(ihost, frame_index); |
1596 | 1595 | ||
1597 | return SCI_SUCCESS; | 1596 | return SCI_SUCCESS; |
1598 | } | 1597 | } |
@@ -1619,12 +1618,12 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1619 | struct dev_to_host_fis *frame_header; | 1618 | struct dev_to_host_fis *frame_header; |
1620 | u32 *frame_buffer; | 1619 | u32 *frame_buffer; |
1621 | 1620 | ||
1622 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1621 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1623 | frame_index, | 1622 | frame_index, |
1624 | (void **)&frame_header); | 1623 | (void **)&frame_header); |
1625 | 1624 | ||
1626 | if (status != SCI_SUCCESS) { | 1625 | if (status != SCI_SUCCESS) { |
1627 | dev_err(scic_to_dev(scic), | 1626 | dev_err(&ihost->pdev->dev, |
1628 | "%s: SCIC IO Request 0x%p could not get frame " | 1627 | "%s: SCIC IO Request 0x%p could not get frame " |
1629 | "header for frame index %d, status %x\n", | 1628 | "header for frame index %d, status %x\n", |
1630 | __func__, | 1629 | __func__, |
@@ -1637,7 +1636,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1637 | 1636 | ||
1638 | switch (frame_header->fis_type) { | 1637 | switch (frame_header->fis_type) { |
1639 | case FIS_REGD2H: | 1638 | case FIS_REGD2H: |
1640 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1639 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1641 | frame_index, | 1640 | frame_index, |
1642 | (void **)&frame_buffer); | 1641 | (void **)&frame_buffer); |
1643 | 1642 | ||
@@ -1651,7 +1650,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1651 | break; | 1650 | break; |
1652 | 1651 | ||
1653 | default: | 1652 | default: |
1654 | dev_warn(scic_to_dev(scic), | 1653 | dev_warn(&ihost->pdev->dev, |
1655 | "%s: IO Request:0x%p Frame Id:%d protocol " | 1654 | "%s: IO Request:0x%p Frame Id:%d protocol " |
1656 | "violation occurred\n", __func__, stp_req, | 1655 | "violation occurred\n", __func__, stp_req, |
1657 | frame_index); | 1656 | frame_index); |
@@ -1664,7 +1663,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1664 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | 1663 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); |
1665 | 1664 | ||
1666 | /* Frame has been decoded return it to the controller */ | 1665 | /* Frame has been decoded return it to the controller */ |
1667 | scic_sds_controller_release_frame(scic, frame_index); | 1666 | scic_sds_controller_release_frame(ihost, frame_index); |
1668 | 1667 | ||
1669 | return status; | 1668 | return status; |
1670 | } | 1669 | } |
@@ -1674,12 +1673,12 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1674 | struct dev_to_host_fis *frame_header; | 1673 | struct dev_to_host_fis *frame_header; |
1675 | u32 *frame_buffer; | 1674 | u32 *frame_buffer; |
1676 | 1675 | ||
1677 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1676 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1678 | frame_index, | 1677 | frame_index, |
1679 | (void **)&frame_header); | 1678 | (void **)&frame_header); |
1680 | 1679 | ||
1681 | if (status != SCI_SUCCESS) { | 1680 | if (status != SCI_SUCCESS) { |
1682 | dev_err(scic_to_dev(scic), | 1681 | dev_err(&ihost->pdev->dev, |
1683 | "%s: SCIC IO Request 0x%p could not get frame " | 1682 | "%s: SCIC IO Request 0x%p could not get frame " |
1684 | "header for frame index %d, status %x\n", | 1683 | "header for frame index %d, status %x\n", |
1685 | __func__, stp_req, frame_index, status); | 1684 | __func__, stp_req, frame_index, status); |
@@ -1689,7 +1688,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1689 | switch (frame_header->fis_type) { | 1688 | switch (frame_header->fis_type) { |
1690 | case FIS_PIO_SETUP: | 1689 | case FIS_PIO_SETUP: |
1691 | /* Get from the frame buffer the PIO Setup Data */ | 1690 | /* Get from the frame buffer the PIO Setup Data */ |
1692 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1691 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1693 | frame_index, | 1692 | frame_index, |
1694 | (void **)&frame_buffer); | 1693 | (void **)&frame_buffer); |
1695 | 1694 | ||
@@ -1736,7 +1735,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1736 | * FIS when it is still busy? Do nothing since | 1735 | * FIS when it is still busy? Do nothing since |
1737 | * we are still in the right state. | 1736 | * we are still in the right state. |
1738 | */ | 1737 | */ |
1739 | dev_dbg(scic_to_dev(scic), | 1738 | dev_dbg(&ihost->pdev->dev, |
1740 | "%s: SCIC PIO Request 0x%p received " | 1739 | "%s: SCIC PIO Request 0x%p received " |
1741 | "D2H Register FIS with BSY status " | 1740 | "D2H Register FIS with BSY status " |
1742 | "0x%x\n", | 1741 | "0x%x\n", |
@@ -1746,7 +1745,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1746 | break; | 1745 | break; |
1747 | } | 1746 | } |
1748 | 1747 | ||
1749 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1748 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1750 | frame_index, | 1749 | frame_index, |
1751 | (void **)&frame_buffer); | 1750 | (void **)&frame_buffer); |
1752 | 1751 | ||
@@ -1767,7 +1766,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1767 | } | 1766 | } |
1768 | 1767 | ||
1769 | /* Frame is decoded return it to the controller */ | 1768 | /* Frame is decoded return it to the controller */ |
1770 | scic_sds_controller_release_frame(scic, frame_index); | 1769 | scic_sds_controller_release_frame(ihost, frame_index); |
1771 | 1770 | ||
1772 | return status; | 1771 | return status; |
1773 | } | 1772 | } |
@@ -1776,12 +1775,12 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1776 | struct dev_to_host_fis *frame_header; | 1775 | struct dev_to_host_fis *frame_header; |
1777 | struct sata_fis_data *frame_buffer; | 1776 | struct sata_fis_data *frame_buffer; |
1778 | 1777 | ||
1779 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1778 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1780 | frame_index, | 1779 | frame_index, |
1781 | (void **)&frame_header); | 1780 | (void **)&frame_header); |
1782 | 1781 | ||
1783 | if (status != SCI_SUCCESS) { | 1782 | if (status != SCI_SUCCESS) { |
1784 | dev_err(scic_to_dev(scic), | 1783 | dev_err(&ihost->pdev->dev, |
1785 | "%s: SCIC IO Request 0x%p could not get frame " | 1784 | "%s: SCIC IO Request 0x%p could not get frame " |
1786 | "header for frame index %d, status %x\n", | 1785 | "header for frame index %d, status %x\n", |
1787 | __func__, | 1786 | __func__, |
@@ -1792,7 +1791,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1792 | } | 1791 | } |
1793 | 1792 | ||
1794 | if (frame_header->fis_type != FIS_DATA) { | 1793 | if (frame_header->fis_type != FIS_DATA) { |
1795 | dev_err(scic_to_dev(scic), | 1794 | dev_err(&ihost->pdev->dev, |
1796 | "%s: SCIC PIO Request 0x%p received frame %d " | 1795 | "%s: SCIC PIO Request 0x%p received frame %d " |
1797 | "with fis type 0x%02x when expecting a data " | 1796 | "with fis type 0x%02x when expecting a data " |
1798 | "fis.\n", | 1797 | "fis.\n", |
@@ -1808,7 +1807,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1808 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | 1807 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); |
1809 | 1808 | ||
1810 | /* Frame is decoded return it to the controller */ | 1809 | /* Frame is decoded return it to the controller */ |
1811 | scic_sds_controller_release_frame(scic, frame_index); | 1810 | scic_sds_controller_release_frame(ihost, frame_index); |
1812 | return status; | 1811 | return status; |
1813 | } | 1812 | } |
1814 | 1813 | ||
@@ -1816,7 +1815,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1816 | ireq->saved_rx_frame_index = frame_index; | 1815 | ireq->saved_rx_frame_index = frame_index; |
1817 | stp_req->pio_len = 0; | 1816 | stp_req->pio_len = 0; |
1818 | } else { | 1817 | } else { |
1819 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1818 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1820 | frame_index, | 1819 | frame_index, |
1821 | (void **)&frame_buffer); | 1820 | (void **)&frame_buffer); |
1822 | 1821 | ||
@@ -1824,7 +1823,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1824 | (u8 *)frame_buffer); | 1823 | (u8 *)frame_buffer); |
1825 | 1824 | ||
1826 | /* Frame is decoded return it to the controller */ | 1825 | /* Frame is decoded return it to the controller */ |
1827 | scic_sds_controller_release_frame(scic, frame_index); | 1826 | scic_sds_controller_release_frame(ihost, frame_index); |
1828 | } | 1827 | } |
1829 | 1828 | ||
1830 | /* Check for the end of the transfer, are there more | 1829 | /* Check for the end of the transfer, are there more |
@@ -1849,11 +1848,11 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1849 | struct dev_to_host_fis *frame_header; | 1848 | struct dev_to_host_fis *frame_header; |
1850 | u32 *frame_buffer; | 1849 | u32 *frame_buffer; |
1851 | 1850 | ||
1852 | status = scic_sds_unsolicited_frame_control_get_header(&scic->uf_control, | 1851 | status = scic_sds_unsolicited_frame_control_get_header(&ihost->uf_control, |
1853 | frame_index, | 1852 | frame_index, |
1854 | (void **)&frame_header); | 1853 | (void **)&frame_header); |
1855 | if (status != SCI_SUCCESS) { | 1854 | if (status != SCI_SUCCESS) { |
1856 | dev_err(scic_to_dev(scic), | 1855 | dev_err(&ihost->pdev->dev, |
1857 | "%s: SCIC IO Request 0x%p could not get frame " | 1856 | "%s: SCIC IO Request 0x%p could not get frame " |
1858 | "header for frame index %d, status %x\n", | 1857 | "header for frame index %d, status %x\n", |
1859 | __func__, | 1858 | __func__, |
@@ -1865,7 +1864,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1865 | 1864 | ||
1866 | switch (frame_header->fis_type) { | 1865 | switch (frame_header->fis_type) { |
1867 | case FIS_REGD2H: | 1866 | case FIS_REGD2H: |
1868 | scic_sds_unsolicited_frame_control_get_buffer(&scic->uf_control, | 1867 | scic_sds_unsolicited_frame_control_get_buffer(&ihost->uf_control, |
1869 | frame_index, | 1868 | frame_index, |
1870 | (void **)&frame_buffer); | 1869 | (void **)&frame_buffer); |
1871 | 1870 | ||
@@ -1880,7 +1879,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1880 | break; | 1879 | break; |
1881 | 1880 | ||
1882 | default: | 1881 | default: |
1883 | dev_warn(scic_to_dev(scic), | 1882 | dev_warn(&ihost->pdev->dev, |
1884 | "%s: IO Request:0x%p Frame Id:%d protocol " | 1883 | "%s: IO Request:0x%p Frame Id:%d protocol " |
1885 | "violation occurred\n", | 1884 | "violation occurred\n", |
1886 | __func__, | 1885 | __func__, |
@@ -1896,7 +1895,7 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1896 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); | 1895 | sci_change_state(&ireq->sm, SCI_REQ_COMPLETED); |
1897 | 1896 | ||
1898 | /* Frame has been decoded return it to the controller */ | 1897 | /* Frame has been decoded return it to the controller */ |
1899 | scic_sds_controller_release_frame(scic, frame_index); | 1898 | scic_sds_controller_release_frame(ihost, frame_index); |
1900 | 1899 | ||
1901 | return status; | 1900 | return status; |
1902 | } | 1901 | } |
@@ -1905,18 +1904,18 @@ scic_sds_io_request_frame_handler(struct isci_request *ireq, | |||
1905 | * TODO: Is it even possible to get an unsolicited frame in the | 1904 | * TODO: Is it even possible to get an unsolicited frame in the |
1906 | * aborting state? | 1905 | * aborting state? |
1907 | */ | 1906 | */ |
1908 | scic_sds_controller_release_frame(scic, frame_index); | 1907 | scic_sds_controller_release_frame(ihost, frame_index); |
1909 | return SCI_SUCCESS; | 1908 | return SCI_SUCCESS; |
1910 | 1909 | ||
1911 | default: | 1910 | default: |
1912 | dev_warn(scic_to_dev(scic), | 1911 | dev_warn(&ihost->pdev->dev, |
1913 | "%s: SCIC IO Request given unexpected frame %x while " | 1912 | "%s: SCIC IO Request given unexpected frame %x while " |
1914 | "in state %d\n", | 1913 | "in state %d\n", |
1915 | __func__, | 1914 | __func__, |
1916 | frame_index, | 1915 | frame_index, |
1917 | state); | 1916 | state); |
1918 | 1917 | ||
1919 | scic_sds_controller_release_frame(scic, frame_index); | 1918 | scic_sds_controller_release_frame(ihost, frame_index); |
1920 | return SCI_FAILURE_INVALID_STATE; | 1919 | return SCI_FAILURE_INVALID_STATE; |
1921 | } | 1920 | } |
1922 | } | 1921 | } |
@@ -2042,7 +2041,7 @@ scic_sds_io_request_tc_completion(struct isci_request *ireq, | |||
2042 | u32 completion_code) | 2041 | u32 completion_code) |
2043 | { | 2042 | { |
2044 | enum sci_base_request_states state; | 2043 | enum sci_base_request_states state; |
2045 | struct scic_sds_controller *scic = ireq->owning_controller; | 2044 | struct isci_host *ihost = ireq->owning_controller; |
2046 | 2045 | ||
2047 | state = ireq->sm.current_state_id; | 2046 | state = ireq->sm.current_state_id; |
2048 | 2047 | ||
@@ -2089,7 +2088,7 @@ scic_sds_io_request_tc_completion(struct isci_request *ireq, | |||
2089 | completion_code); | 2088 | completion_code); |
2090 | 2089 | ||
2091 | default: | 2090 | default: |
2092 | dev_warn(scic_to_dev(scic), | 2091 | dev_warn(&ihost->pdev->dev, |
2093 | "%s: SCIC IO Request given task completion " | 2092 | "%s: SCIC IO Request given task completion " |
2094 | "notification %x while in wrong state %d\n", | 2093 | "notification %x while in wrong state %d\n", |
2095 | __func__, | 2094 | __func__, |
@@ -2480,7 +2479,7 @@ static void isci_task_save_for_upper_layer_completion( | |||
2480 | } | 2479 | } |
2481 | } | 2480 | } |
2482 | 2481 | ||
2483 | static void isci_request_io_request_complete(struct isci_host *isci_host, | 2482 | static void isci_request_io_request_complete(struct isci_host *ihost, |
2484 | struct isci_request *request, | 2483 | struct isci_request *request, |
2485 | enum sci_io_status completion_status) | 2484 | enum sci_io_status completion_status) |
2486 | { | 2485 | { |
@@ -2495,7 +2494,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2495 | enum isci_completion_selection complete_to_host | 2494 | enum isci_completion_selection complete_to_host |
2496 | = isci_perform_normal_io_completion; | 2495 | = isci_perform_normal_io_completion; |
2497 | 2496 | ||
2498 | dev_dbg(&isci_host->pdev->dev, | 2497 | dev_dbg(&ihost->pdev->dev, |
2499 | "%s: request = %p, task = %p,\n" | 2498 | "%s: request = %p, task = %p,\n" |
2500 | "task->data_dir = %d completion_status = 0x%x\n", | 2499 | "task->data_dir = %d completion_status = 0x%x\n", |
2501 | __func__, | 2500 | __func__, |
@@ -2616,7 +2615,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2616 | switch (completion_status) { | 2615 | switch (completion_status) { |
2617 | 2616 | ||
2618 | case SCI_IO_FAILURE_RESPONSE_VALID: | 2617 | case SCI_IO_FAILURE_RESPONSE_VALID: |
2619 | dev_dbg(&isci_host->pdev->dev, | 2618 | dev_dbg(&ihost->pdev->dev, |
2620 | "%s: SCI_IO_FAILURE_RESPONSE_VALID (%p/%p)\n", | 2619 | "%s: SCI_IO_FAILURE_RESPONSE_VALID (%p/%p)\n", |
2621 | __func__, | 2620 | __func__, |
2622 | request, | 2621 | request, |
@@ -2631,17 +2630,17 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2631 | /* crack the iu response buffer. */ | 2630 | /* crack the iu response buffer. */ |
2632 | resp_iu = &request->ssp.rsp; | 2631 | resp_iu = &request->ssp.rsp; |
2633 | isci_request_process_response_iu(task, resp_iu, | 2632 | isci_request_process_response_iu(task, resp_iu, |
2634 | &isci_host->pdev->dev); | 2633 | &ihost->pdev->dev); |
2635 | 2634 | ||
2636 | } else if (SAS_PROTOCOL_SMP == task->task_proto) { | 2635 | } else if (SAS_PROTOCOL_SMP == task->task_proto) { |
2637 | 2636 | ||
2638 | dev_err(&isci_host->pdev->dev, | 2637 | dev_err(&ihost->pdev->dev, |
2639 | "%s: SCI_IO_FAILURE_RESPONSE_VALID: " | 2638 | "%s: SCI_IO_FAILURE_RESPONSE_VALID: " |
2640 | "SAS_PROTOCOL_SMP protocol\n", | 2639 | "SAS_PROTOCOL_SMP protocol\n", |
2641 | __func__); | 2640 | __func__); |
2642 | 2641 | ||
2643 | } else | 2642 | } else |
2644 | dev_err(&isci_host->pdev->dev, | 2643 | dev_err(&ihost->pdev->dev, |
2645 | "%s: unknown protocol\n", __func__); | 2644 | "%s: unknown protocol\n", __func__); |
2646 | 2645 | ||
2647 | /* use the task status set in the task struct by the | 2646 | /* use the task status set in the task struct by the |
@@ -2662,7 +2661,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2662 | if (task->task_proto == SAS_PROTOCOL_SMP) { | 2661 | if (task->task_proto == SAS_PROTOCOL_SMP) { |
2663 | void *rsp = &request->smp.rsp; | 2662 | void *rsp = &request->smp.rsp; |
2664 | 2663 | ||
2665 | dev_dbg(&isci_host->pdev->dev, | 2664 | dev_dbg(&ihost->pdev->dev, |
2666 | "%s: SMP protocol completion\n", | 2665 | "%s: SMP protocol completion\n", |
2667 | __func__); | 2666 | __func__); |
2668 | 2667 | ||
@@ -2687,20 +2686,20 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2687 | if (task->task_status.residual != 0) | 2686 | if (task->task_status.residual != 0) |
2688 | status = SAS_DATA_UNDERRUN; | 2687 | status = SAS_DATA_UNDERRUN; |
2689 | 2688 | ||
2690 | dev_dbg(&isci_host->pdev->dev, | 2689 | dev_dbg(&ihost->pdev->dev, |
2691 | "%s: SCI_IO_SUCCESS_IO_DONE_EARLY %d\n", | 2690 | "%s: SCI_IO_SUCCESS_IO_DONE_EARLY %d\n", |
2692 | __func__, | 2691 | __func__, |
2693 | status); | 2692 | status); |
2694 | 2693 | ||
2695 | } else | 2694 | } else |
2696 | dev_dbg(&isci_host->pdev->dev, | 2695 | dev_dbg(&ihost->pdev->dev, |
2697 | "%s: SCI_IO_SUCCESS\n", | 2696 | "%s: SCI_IO_SUCCESS\n", |
2698 | __func__); | 2697 | __func__); |
2699 | 2698 | ||
2700 | break; | 2699 | break; |
2701 | 2700 | ||
2702 | case SCI_IO_FAILURE_TERMINATED: | 2701 | case SCI_IO_FAILURE_TERMINATED: |
2703 | dev_dbg(&isci_host->pdev->dev, | 2702 | dev_dbg(&ihost->pdev->dev, |
2704 | "%s: SCI_IO_FAILURE_TERMINATED (%p/%p)\n", | 2703 | "%s: SCI_IO_FAILURE_TERMINATED (%p/%p)\n", |
2705 | __func__, | 2704 | __func__, |
2706 | request, | 2705 | request, |
@@ -2768,7 +2767,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2768 | 2767 | ||
2769 | default: | 2768 | default: |
2770 | /* Catch any otherwise unhandled error codes here. */ | 2769 | /* Catch any otherwise unhandled error codes here. */ |
2771 | dev_warn(&isci_host->pdev->dev, | 2770 | dev_warn(&ihost->pdev->dev, |
2772 | "%s: invalid completion code: 0x%x - " | 2771 | "%s: invalid completion code: 0x%x - " |
2773 | "isci_request = %p\n", | 2772 | "isci_request = %p\n", |
2774 | __func__, completion_status, request); | 2773 | __func__, completion_status, request); |
@@ -2802,11 +2801,11 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2802 | break; | 2801 | break; |
2803 | if (task->num_scatter == 0) | 2802 | if (task->num_scatter == 0) |
2804 | /* 0 indicates a single dma address */ | 2803 | /* 0 indicates a single dma address */ |
2805 | dma_unmap_single(&isci_host->pdev->dev, | 2804 | dma_unmap_single(&ihost->pdev->dev, |
2806 | request->zero_scatter_daddr, | 2805 | request->zero_scatter_daddr, |
2807 | task->total_xfer_len, task->data_dir); | 2806 | task->total_xfer_len, task->data_dir); |
2808 | else /* unmap the sgl dma addresses */ | 2807 | else /* unmap the sgl dma addresses */ |
2809 | dma_unmap_sg(&isci_host->pdev->dev, task->scatter, | 2808 | dma_unmap_sg(&ihost->pdev->dev, task->scatter, |
2810 | request->num_sg_entries, task->data_dir); | 2809 | request->num_sg_entries, task->data_dir); |
2811 | break; | 2810 | break; |
2812 | case SAS_PROTOCOL_SMP: { | 2811 | case SAS_PROTOCOL_SMP: { |
@@ -2814,7 +2813,7 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2814 | struct smp_req *smp_req; | 2813 | struct smp_req *smp_req; |
2815 | void *kaddr; | 2814 | void *kaddr; |
2816 | 2815 | ||
2817 | dma_unmap_sg(&isci_host->pdev->dev, sg, 1, DMA_TO_DEVICE); | 2816 | dma_unmap_sg(&ihost->pdev->dev, sg, 1, DMA_TO_DEVICE); |
2818 | 2817 | ||
2819 | /* need to swab it back in case the command buffer is re-used */ | 2818 | /* need to swab it back in case the command buffer is re-used */ |
2820 | kaddr = kmap_atomic(sg_page(sg), KM_IRQ0); | 2819 | kaddr = kmap_atomic(sg_page(sg), KM_IRQ0); |
@@ -2828,14 +2827,12 @@ static void isci_request_io_request_complete(struct isci_host *isci_host, | |||
2828 | } | 2827 | } |
2829 | 2828 | ||
2830 | /* Put the completed request on the correct list */ | 2829 | /* Put the completed request on the correct list */ |
2831 | isci_task_save_for_upper_layer_completion(isci_host, request, response, | 2830 | isci_task_save_for_upper_layer_completion(ihost, request, response, |
2832 | status, complete_to_host | 2831 | status, complete_to_host |
2833 | ); | 2832 | ); |
2834 | 2833 | ||
2835 | /* complete the io request to the core. */ | 2834 | /* complete the io request to the core. */ |
2836 | scic_controller_complete_io(&isci_host->sci, | 2835 | scic_controller_complete_io(ihost, request->target_device, request); |
2837 | request->target_device, | ||
2838 | request); | ||
2839 | isci_put_device(idev); | 2836 | isci_put_device(idev); |
2840 | 2837 | ||
2841 | /* set terminated handle so it cannot be completed or | 2838 | /* set terminated handle so it cannot be completed or |
@@ -2885,8 +2882,7 @@ static void scic_sds_request_started_state_enter(struct sci_base_state_machine * | |||
2885 | static void scic_sds_request_completed_state_enter(struct sci_base_state_machine *sm) | 2882 | static void scic_sds_request_completed_state_enter(struct sci_base_state_machine *sm) |
2886 | { | 2883 | { |
2887 | struct isci_request *ireq = container_of(sm, typeof(*ireq), sm); | 2884 | struct isci_request *ireq = container_of(sm, typeof(*ireq), sm); |
2888 | struct scic_sds_controller *scic = ireq->owning_controller; | 2885 | struct isci_host *ihost = ireq->owning_controller; |
2889 | struct isci_host *ihost = scic_to_ihost(scic); | ||
2890 | 2886 | ||
2891 | /* Tell the SCI_USER that the IO request is complete */ | 2887 | /* Tell the SCI_USER that the IO request is complete */ |
2892 | if (!test_bit(IREQ_TMF, &ireq->flags)) | 2888 | if (!test_bit(IREQ_TMF, &ireq->flags)) |
@@ -2985,7 +2981,7 @@ static const struct sci_base_state scic_sds_request_state_table[] = { | |||
2985 | }; | 2981 | }; |
2986 | 2982 | ||
2987 | static void | 2983 | static void |
2988 | scic_sds_general_request_construct(struct scic_sds_controller *scic, | 2984 | scic_sds_general_request_construct(struct isci_host *ihost, |
2989 | struct isci_remote_device *idev, | 2985 | struct isci_remote_device *idev, |
2990 | struct isci_request *ireq) | 2986 | struct isci_request *ireq) |
2991 | { | 2987 | { |
@@ -3001,7 +2997,7 @@ scic_sds_general_request_construct(struct scic_sds_controller *scic, | |||
3001 | } | 2997 | } |
3002 | 2998 | ||
3003 | static enum sci_status | 2999 | static enum sci_status |
3004 | scic_io_request_construct(struct scic_sds_controller *scic, | 3000 | scic_io_request_construct(struct isci_host *ihost, |
3005 | struct isci_remote_device *idev, | 3001 | struct isci_remote_device *idev, |
3006 | struct isci_request *ireq) | 3002 | struct isci_request *ireq) |
3007 | { | 3003 | { |
@@ -3009,7 +3005,7 @@ scic_io_request_construct(struct scic_sds_controller *scic, | |||
3009 | enum sci_status status = SCI_SUCCESS; | 3005 | enum sci_status status = SCI_SUCCESS; |
3010 | 3006 | ||
3011 | /* Build the common part of the request */ | 3007 | /* Build the common part of the request */ |
3012 | scic_sds_general_request_construct(scic, idev, ireq); | 3008 | scic_sds_general_request_construct(ihost, idev, ireq); |
3013 | 3009 | ||
3014 | if (idev->rnc.remote_node_index == SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX) | 3010 | if (idev->rnc.remote_node_index == SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX) |
3015 | return SCI_FAILURE_INVALID_REMOTE_DEVICE; | 3011 | return SCI_FAILURE_INVALID_REMOTE_DEVICE; |
@@ -3028,7 +3024,7 @@ scic_io_request_construct(struct scic_sds_controller *scic, | |||
3028 | return status; | 3024 | return status; |
3029 | } | 3025 | } |
3030 | 3026 | ||
3031 | enum sci_status scic_task_request_construct(struct scic_sds_controller *scic, | 3027 | enum sci_status scic_task_request_construct(struct isci_host *ihost, |
3032 | struct isci_remote_device *idev, | 3028 | struct isci_remote_device *idev, |
3033 | u16 io_tag, struct isci_request *ireq) | 3029 | u16 io_tag, struct isci_request *ireq) |
3034 | { | 3030 | { |
@@ -3036,7 +3032,7 @@ enum sci_status scic_task_request_construct(struct scic_sds_controller *scic, | |||
3036 | enum sci_status status = SCI_SUCCESS; | 3032 | enum sci_status status = SCI_SUCCESS; |
3037 | 3033 | ||
3038 | /* Build the common part of the request */ | 3034 | /* Build the common part of the request */ |
3039 | scic_sds_general_request_construct(scic, idev, ireq); | 3035 | scic_sds_general_request_construct(ihost, idev, ireq); |
3040 | 3036 | ||
3041 | if (dev->dev_type == SAS_END_DEV || | 3037 | if (dev->dev_type == SAS_END_DEV || |
3042 | dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { | 3038 | dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
@@ -3156,7 +3152,7 @@ scic_io_request_construct_smp(struct device *dev, | |||
3156 | task_context->initiator_request = 1; | 3152 | task_context->initiator_request = 1; |
3157 | task_context->connection_rate = idev->connection_rate; | 3153 | task_context->connection_rate = idev->connection_rate; |
3158 | task_context->protocol_engine_index = | 3154 | task_context->protocol_engine_index = |
3159 | scic_sds_controller_get_protocol_engine_group(scic); | 3155 | scic_sds_controller_get_protocol_engine_group(ihost); |
3160 | task_context->logical_port_index = scic_sds_port_get_index(iport); | 3156 | task_context->logical_port_index = scic_sds_port_get_index(iport); |
3161 | task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_SMP; | 3157 | task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_SMP; |
3162 | task_context->abort = 0; | 3158 | task_context->abort = 0; |
@@ -3199,7 +3195,7 @@ scic_io_request_construct_smp(struct device *dev, | |||
3199 | task_context->task_phase = 0; | 3195 | task_context->task_phase = 0; |
3200 | 3196 | ||
3201 | ireq->post_context = (SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC | | 3197 | ireq->post_context = (SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC | |
3202 | (scic_sds_controller_get_protocol_engine_group(scic) << | 3198 | (scic_sds_controller_get_protocol_engine_group(ihost) << |
3203 | SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT) | | 3199 | SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT) | |
3204 | (scic_sds_port_get_index(iport) << | 3200 | (scic_sds_port_get_index(iport) << |
3205 | SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT) | | 3201 | SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT) | |
@@ -3245,7 +3241,7 @@ static enum sci_status isci_smp_request_build(struct isci_request *ireq) | |||
3245 | 3241 | ||
3246 | /** | 3242 | /** |
3247 | * isci_io_request_build() - This function builds the io request object. | 3243 | * isci_io_request_build() - This function builds the io request object. |
3248 | * @isci_host: This parameter specifies the ISCI host object | 3244 | * @ihost: This parameter specifies the ISCI host object |
3249 | * @request: This parameter points to the isci_request object allocated in the | 3245 | * @request: This parameter points to the isci_request object allocated in the |
3250 | * request construct function. | 3246 | * request construct function. |
3251 | * @sci_device: This parameter is the handle for the sci core's remote device | 3247 | * @sci_device: This parameter is the handle for the sci core's remote device |
@@ -3253,14 +3249,14 @@ static enum sci_status isci_smp_request_build(struct isci_request *ireq) | |||
3253 | * | 3249 | * |
3254 | * SCI_SUCCESS on successfull completion, or specific failure code. | 3250 | * SCI_SUCCESS on successfull completion, or specific failure code. |
3255 | */ | 3251 | */ |
3256 | static enum sci_status isci_io_request_build(struct isci_host *isci_host, | 3252 | static enum sci_status isci_io_request_build(struct isci_host *ihost, |
3257 | struct isci_request *request, | 3253 | struct isci_request *request, |
3258 | struct isci_remote_device *idev) | 3254 | struct isci_remote_device *idev) |
3259 | { | 3255 | { |
3260 | enum sci_status status = SCI_SUCCESS; | 3256 | enum sci_status status = SCI_SUCCESS; |
3261 | struct sas_task *task = isci_request_access_task(request); | 3257 | struct sas_task *task = isci_request_access_task(request); |
3262 | 3258 | ||
3263 | dev_dbg(&isci_host->pdev->dev, | 3259 | dev_dbg(&ihost->pdev->dev, |
3264 | "%s: idev = 0x%p; request = %p, " | 3260 | "%s: idev = 0x%p; request = %p, " |
3265 | "num_scatter = %d\n", | 3261 | "num_scatter = %d\n", |
3266 | __func__, | 3262 | __func__, |
@@ -3277,7 +3273,7 @@ static enum sci_status isci_io_request_build(struct isci_host *isci_host, | |||
3277 | !(SAS_PROTOCOL_SMP & task->task_proto)) { | 3273 | !(SAS_PROTOCOL_SMP & task->task_proto)) { |
3278 | 3274 | ||
3279 | request->num_sg_entries = dma_map_sg( | 3275 | request->num_sg_entries = dma_map_sg( |
3280 | &isci_host->pdev->dev, | 3276 | &ihost->pdev->dev, |
3281 | task->scatter, | 3277 | task->scatter, |
3282 | task->num_scatter, | 3278 | task->num_scatter, |
3283 | task->data_dir | 3279 | task->data_dir |
@@ -3287,10 +3283,10 @@ static enum sci_status isci_io_request_build(struct isci_host *isci_host, | |||
3287 | return SCI_FAILURE_INSUFFICIENT_RESOURCES; | 3283 | return SCI_FAILURE_INSUFFICIENT_RESOURCES; |
3288 | } | 3284 | } |
3289 | 3285 | ||
3290 | status = scic_io_request_construct(&isci_host->sci, idev, request); | 3286 | status = scic_io_request_construct(ihost, idev, request); |
3291 | 3287 | ||
3292 | if (status != SCI_SUCCESS) { | 3288 | if (status != SCI_SUCCESS) { |
3293 | dev_warn(&isci_host->pdev->dev, | 3289 | dev_warn(&ihost->pdev->dev, |
3294 | "%s: failed request construct\n", | 3290 | "%s: failed request construct\n", |
3295 | __func__); | 3291 | __func__); |
3296 | return SCI_FAILURE; | 3292 | return SCI_FAILURE; |
@@ -3309,7 +3305,7 @@ static enum sci_status isci_io_request_build(struct isci_host *isci_host, | |||
3309 | status = isci_request_stp_request_construct(request); | 3305 | status = isci_request_stp_request_construct(request); |
3310 | break; | 3306 | break; |
3311 | default: | 3307 | default: |
3312 | dev_warn(&isci_host->pdev->dev, | 3308 | dev_warn(&ihost->pdev->dev, |
3313 | "%s: unknown protocol\n", __func__); | 3309 | "%s: unknown protocol\n", __func__); |
3314 | return SCI_FAILURE; | 3310 | return SCI_FAILURE; |
3315 | } | 3311 | } |
@@ -3392,7 +3388,7 @@ int isci_request_execute(struct isci_host *ihost, struct isci_remote_device *ide | |||
3392 | * request was built that way (ie. | 3388 | * request was built that way (ie. |
3393 | * ireq->is_task_management_request is false). | 3389 | * ireq->is_task_management_request is false). |
3394 | */ | 3390 | */ |
3395 | status = scic_controller_start_task(&ihost->sci, | 3391 | status = scic_controller_start_task(ihost, |
3396 | idev, | 3392 | idev, |
3397 | ireq); | 3393 | ireq); |
3398 | } else { | 3394 | } else { |
@@ -3400,7 +3396,7 @@ int isci_request_execute(struct isci_host *ihost, struct isci_remote_device *ide | |||
3400 | } | 3396 | } |
3401 | } else { | 3397 | } else { |
3402 | /* send the request, let the core assign the IO TAG. */ | 3398 | /* send the request, let the core assign the IO TAG. */ |
3403 | status = scic_controller_start_io(&ihost->sci, idev, | 3399 | status = scic_controller_start_io(ihost, idev, |
3404 | ireq); | 3400 | ireq); |
3405 | } | 3401 | } |
3406 | 3402 | ||
diff --git a/drivers/scsi/isci/request.h b/drivers/scsi/isci/request.h index ca64ea207ac8..0cafcead7a01 100644 --- a/drivers/scsi/isci/request.h +++ b/drivers/scsi/isci/request.h | |||
@@ -145,7 +145,7 @@ struct isci_request { | |||
145 | */ | 145 | */ |
146 | struct completion *io_request_completion; | 146 | struct completion *io_request_completion; |
147 | struct sci_base_state_machine sm; | 147 | struct sci_base_state_machine sm; |
148 | struct scic_sds_controller *owning_controller; | 148 | struct isci_host *owning_controller; |
149 | struct isci_remote_device *target_device; | 149 | struct isci_remote_device *target_device; |
150 | u16 io_tag; | 150 | u16 io_tag; |
151 | enum sci_request_protocol protocol; | 151 | enum sci_request_protocol protocol; |
@@ -500,7 +500,7 @@ int isci_request_execute(struct isci_host *ihost, struct isci_remote_device *ide | |||
500 | void isci_terminate_pending_requests(struct isci_host *ihost, | 500 | void isci_terminate_pending_requests(struct isci_host *ihost, |
501 | struct isci_remote_device *idev); | 501 | struct isci_remote_device *idev); |
502 | enum sci_status | 502 | enum sci_status |
503 | scic_task_request_construct(struct scic_sds_controller *scic, | 503 | scic_task_request_construct(struct isci_host *ihost, |
504 | struct isci_remote_device *idev, | 504 | struct isci_remote_device *idev, |
505 | u16 io_tag, | 505 | u16 io_tag, |
506 | struct isci_request *ireq); | 506 | struct isci_request *ireq); |
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index 89b01eef44b1..3a1fc55a7557 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c | |||
@@ -257,7 +257,7 @@ static struct isci_request *isci_task_request_build(struct isci_host *ihost, | |||
257 | return NULL; | 257 | return NULL; |
258 | 258 | ||
259 | /* let the core do it's construct. */ | 259 | /* let the core do it's construct. */ |
260 | status = scic_task_request_construct(&ihost->sci, idev, tag, | 260 | status = scic_task_request_construct(ihost, idev, tag, |
261 | ireq); | 261 | ireq); |
262 | 262 | ||
263 | if (status != SCI_SUCCESS) { | 263 | if (status != SCI_SUCCESS) { |
@@ -332,7 +332,7 @@ int isci_task_execute_tmf(struct isci_host *ihost, | |||
332 | spin_lock_irqsave(&ihost->scic_lock, flags); | 332 | spin_lock_irqsave(&ihost->scic_lock, flags); |
333 | 333 | ||
334 | /* start the TMF io. */ | 334 | /* start the TMF io. */ |
335 | status = scic_controller_start_task(&ihost->sci, idev, ireq); | 335 | status = scic_controller_start_task(ihost, idev, ireq); |
336 | 336 | ||
337 | if (status != SCI_TASK_SUCCESS) { | 337 | if (status != SCI_TASK_SUCCESS) { |
338 | dev_warn(&ihost->pdev->dev, | 338 | dev_warn(&ihost->pdev->dev, |
@@ -364,7 +364,7 @@ int isci_task_execute_tmf(struct isci_host *ihost, | |||
364 | if (tmf->cb_state_func != NULL) | 364 | if (tmf->cb_state_func != NULL) |
365 | tmf->cb_state_func(isci_tmf_timed_out, tmf, tmf->cb_data); | 365 | tmf->cb_state_func(isci_tmf_timed_out, tmf, tmf->cb_data); |
366 | 366 | ||
367 | scic_controller_terminate_request(&ihost->sci, | 367 | scic_controller_terminate_request(ihost, |
368 | idev, | 368 | idev, |
369 | ireq); | 369 | ireq); |
370 | 370 | ||
@@ -514,15 +514,14 @@ static void isci_request_cleanup_completed_loiterer( | |||
514 | * request, and wait for it to complete. This function must only be called | 514 | * request, and wait for it to complete. This function must only be called |
515 | * from a thread that can wait. Note that the request is terminated and | 515 | * from a thread that can wait. Note that the request is terminated and |
516 | * completed (back to the host, if started there). | 516 | * completed (back to the host, if started there). |
517 | * @isci_host: This SCU. | 517 | * @ihost: This SCU. |
518 | * @idev: The target. | 518 | * @idev: The target. |
519 | * @isci_request: The I/O request to be terminated. | 519 | * @isci_request: The I/O request to be terminated. |
520 | * | 520 | * |
521 | */ | 521 | */ |
522 | static void isci_terminate_request_core( | 522 | static void isci_terminate_request_core(struct isci_host *ihost, |
523 | struct isci_host *isci_host, | 523 | struct isci_remote_device *idev, |
524 | struct isci_remote_device *idev, | 524 | struct isci_request *isci_request) |
525 | struct isci_request *isci_request) | ||
526 | { | 525 | { |
527 | enum sci_status status = SCI_SUCCESS; | 526 | enum sci_status status = SCI_SUCCESS; |
528 | bool was_terminated = false; | 527 | bool was_terminated = false; |
@@ -533,11 +532,11 @@ static void isci_terminate_request_core( | |||
533 | struct completion *io_request_completion; | 532 | struct completion *io_request_completion; |
534 | struct sas_task *task; | 533 | struct sas_task *task; |
535 | 534 | ||
536 | dev_dbg(&isci_host->pdev->dev, | 535 | dev_dbg(&ihost->pdev->dev, |
537 | "%s: device = %p; request = %p\n", | 536 | "%s: device = %p; request = %p\n", |
538 | __func__, idev, isci_request); | 537 | __func__, idev, isci_request); |
539 | 538 | ||
540 | spin_lock_irqsave(&isci_host->scic_lock, flags); | 539 | spin_lock_irqsave(&ihost->scic_lock, flags); |
541 | 540 | ||
542 | io_request_completion = isci_request->io_request_completion; | 541 | io_request_completion = isci_request->io_request_completion; |
543 | 542 | ||
@@ -557,12 +556,11 @@ static void isci_terminate_request_core( | |||
557 | if (!test_bit(IREQ_TERMINATED, &isci_request->flags)) { | 556 | if (!test_bit(IREQ_TERMINATED, &isci_request->flags)) { |
558 | was_terminated = true; | 557 | was_terminated = true; |
559 | needs_cleanup_handling = true; | 558 | needs_cleanup_handling = true; |
560 | status = scic_controller_terminate_request( | 559 | status = scic_controller_terminate_request(ihost, |
561 | &isci_host->sci, | 560 | idev, |
562 | idev, | 561 | isci_request); |
563 | isci_request); | ||
564 | } | 562 | } |
565 | spin_unlock_irqrestore(&isci_host->scic_lock, flags); | 563 | spin_unlock_irqrestore(&ihost->scic_lock, flags); |
566 | 564 | ||
567 | /* | 565 | /* |
568 | * The only time the request to terminate will | 566 | * The only time the request to terminate will |
@@ -570,7 +568,7 @@ static void isci_terminate_request_core( | |||
570 | * being aborted. | 568 | * being aborted. |
571 | */ | 569 | */ |
572 | if (status != SCI_SUCCESS) { | 570 | if (status != SCI_SUCCESS) { |
573 | dev_err(&isci_host->pdev->dev, | 571 | dev_err(&ihost->pdev->dev, |
574 | "%s: scic_controller_terminate_request" | 572 | "%s: scic_controller_terminate_request" |
575 | " returned = 0x%x\n", | 573 | " returned = 0x%x\n", |
576 | __func__, status); | 574 | __func__, status); |
@@ -579,7 +577,7 @@ static void isci_terminate_request_core( | |||
579 | 577 | ||
580 | } else { | 578 | } else { |
581 | if (was_terminated) { | 579 | if (was_terminated) { |
582 | dev_dbg(&isci_host->pdev->dev, | 580 | dev_dbg(&ihost->pdev->dev, |
583 | "%s: before completion wait (%p/%p)\n", | 581 | "%s: before completion wait (%p/%p)\n", |
584 | __func__, isci_request, io_request_completion); | 582 | __func__, isci_request, io_request_completion); |
585 | 583 | ||
@@ -593,7 +591,7 @@ static void isci_terminate_request_core( | |||
593 | if (!termination_completed) { | 591 | if (!termination_completed) { |
594 | 592 | ||
595 | /* The request to terminate has timed out. */ | 593 | /* The request to terminate has timed out. */ |
596 | spin_lock_irqsave(&isci_host->scic_lock, | 594 | spin_lock_irqsave(&ihost->scic_lock, |
597 | flags); | 595 | flags); |
598 | 596 | ||
599 | /* Check for state changes. */ | 597 | /* Check for state changes. */ |
@@ -623,12 +621,12 @@ static void isci_terminate_request_core( | |||
623 | } else | 621 | } else |
624 | termination_completed = 1; | 622 | termination_completed = 1; |
625 | 623 | ||
626 | spin_unlock_irqrestore(&isci_host->scic_lock, | 624 | spin_unlock_irqrestore(&ihost->scic_lock, |
627 | flags); | 625 | flags); |
628 | 626 | ||
629 | if (!termination_completed) { | 627 | if (!termination_completed) { |
630 | 628 | ||
631 | dev_err(&isci_host->pdev->dev, | 629 | dev_err(&ihost->pdev->dev, |
632 | "%s: *** Timeout waiting for " | 630 | "%s: *** Timeout waiting for " |
633 | "termination(%p/%p)\n", | 631 | "termination(%p/%p)\n", |
634 | __func__, io_request_completion, | 632 | __func__, io_request_completion, |
@@ -642,7 +640,7 @@ static void isci_terminate_request_core( | |||
642 | } | 640 | } |
643 | } | 641 | } |
644 | if (termination_completed) | 642 | if (termination_completed) |
645 | dev_dbg(&isci_host->pdev->dev, | 643 | dev_dbg(&ihost->pdev->dev, |
646 | "%s: after completion wait (%p/%p)\n", | 644 | "%s: after completion wait (%p/%p)\n", |
647 | __func__, isci_request, io_request_completion); | 645 | __func__, isci_request, io_request_completion); |
648 | } | 646 | } |
@@ -678,7 +676,7 @@ static void isci_terminate_request_core( | |||
678 | } | 676 | } |
679 | if (needs_cleanup_handling) | 677 | if (needs_cleanup_handling) |
680 | isci_request_cleanup_completed_loiterer( | 678 | isci_request_cleanup_completed_loiterer( |
681 | isci_host, idev, isci_request, task); | 679 | ihost, idev, isci_request, task); |
682 | } | 680 | } |
683 | } | 681 | } |
684 | 682 | ||
@@ -1253,7 +1251,7 @@ isci_task_request_complete(struct isci_host *ihost, | |||
1253 | /* PRINT_TMF( ((struct isci_tmf *)request->task)); */ | 1251 | /* PRINT_TMF( ((struct isci_tmf *)request->task)); */ |
1254 | tmf_complete = tmf->complete; | 1252 | tmf_complete = tmf->complete; |
1255 | 1253 | ||
1256 | scic_controller_complete_io(&ihost->sci, ireq->target_device, ireq); | 1254 | scic_controller_complete_io(ihost, ireq->target_device, ireq); |
1257 | /* set the 'terminated' flag handle to make sure it cannot be terminated | 1255 | /* set the 'terminated' flag handle to make sure it cannot be terminated |
1258 | * or completed again. | 1256 | * or completed again. |
1259 | */ | 1257 | */ |
diff --git a/drivers/scsi/isci/unsolicited_frame_control.c b/drivers/scsi/isci/unsolicited_frame_control.c index 680582d8cde5..a0e6f89fc6a1 100644 --- a/drivers/scsi/isci/unsolicited_frame_control.c +++ b/drivers/scsi/isci/unsolicited_frame_control.c | |||
@@ -57,9 +57,9 @@ | |||
57 | #include "unsolicited_frame_control.h" | 57 | #include "unsolicited_frame_control.h" |
58 | #include "registers.h" | 58 | #include "registers.h" |
59 | 59 | ||
60 | int scic_sds_unsolicited_frame_control_construct(struct scic_sds_controller *scic) | 60 | int scic_sds_unsolicited_frame_control_construct(struct isci_host *ihost) |
61 | { | 61 | { |
62 | struct scic_sds_unsolicited_frame_control *uf_control = &scic->uf_control; | 62 | struct scic_sds_unsolicited_frame_control *uf_control = &ihost->uf_control; |
63 | struct scic_sds_unsolicited_frame *uf; | 63 | struct scic_sds_unsolicited_frame *uf; |
64 | u32 buf_len, header_len, i; | 64 | u32 buf_len, header_len, i; |
65 | dma_addr_t dma; | 65 | dma_addr_t dma; |
@@ -79,7 +79,7 @@ int scic_sds_unsolicited_frame_control_construct(struct scic_sds_controller *sci | |||
79 | * memory descriptor entry. The headers and address table will be | 79 | * memory descriptor entry. The headers and address table will be |
80 | * placed after the buffers. | 80 | * placed after the buffers. |
81 | */ | 81 | */ |
82 | virt = dmam_alloc_coherent(scic_to_dev(scic), size, &dma, GFP_KERNEL); | 82 | virt = dmam_alloc_coherent(&ihost->pdev->dev, size, &dma, GFP_KERNEL); |
83 | if (!virt) | 83 | if (!virt) |
84 | return -ENOMEM; | 84 | return -ENOMEM; |
85 | 85 | ||
diff --git a/drivers/scsi/isci/unsolicited_frame_control.h b/drivers/scsi/isci/unsolicited_frame_control.h index 2954904f025a..c0285a3db562 100644 --- a/drivers/scsi/isci/unsolicited_frame_control.h +++ b/drivers/scsi/isci/unsolicited_frame_control.h | |||
@@ -214,9 +214,9 @@ struct scic_sds_unsolicited_frame_control { | |||
214 | 214 | ||
215 | }; | 215 | }; |
216 | 216 | ||
217 | struct scic_sds_controller; | 217 | struct isci_host; |
218 | 218 | ||
219 | int scic_sds_unsolicited_frame_control_construct(struct scic_sds_controller *scic); | 219 | int scic_sds_unsolicited_frame_control_construct(struct isci_host *ihost); |
220 | 220 | ||
221 | enum sci_status scic_sds_unsolicited_frame_control_get_header( | 221 | enum sci_status scic_sds_unsolicited_frame_control_get_header( |
222 | struct scic_sds_unsolicited_frame_control *uf_control, | 222 | struct scic_sds_unsolicited_frame_control *uf_control, |