diff options
-rw-r--r-- | drivers/scsi/isci/core/scic_sds_controller.c | 73 | ||||
-rw-r--r-- | drivers/scsi/isci/host.c | 28 | ||||
-rw-r--r-- | drivers/scsi/isci/init.c | 30 | ||||
-rw-r--r-- | drivers/scsi/isci/isci.h | 8 |
4 files changed, 102 insertions, 37 deletions
diff --git a/drivers/scsi/isci/core/scic_sds_controller.c b/drivers/scsi/isci/core/scic_sds_controller.c index b0edd8408fe7..cd31cba28f88 100644 --- a/drivers/scsi/isci/core/scic_sds_controller.c +++ b/drivers/scsi/isci/core/scic_sds_controller.c | |||
@@ -2548,41 +2548,46 @@ enum sci_status scic_user_parameters_set( | |||
2548 | struct scic_sds_controller *scic, | 2548 | struct scic_sds_controller *scic, |
2549 | union scic_user_parameters *scic_parms) | 2549 | union scic_user_parameters *scic_parms) |
2550 | { | 2550 | { |
2551 | if ( | 2551 | u32 state = scic->parent.state_machine.current_state_id; |
2552 | (scic->parent.state_machine.current_state_id | 2552 | |
2553 | == SCI_BASE_CONTROLLER_STATE_RESET) | 2553 | if (state == SCI_BASE_CONTROLLER_STATE_RESET || |
2554 | || (scic->parent.state_machine.current_state_id | 2554 | state == SCI_BASE_CONTROLLER_STATE_INITIALIZING || |
2555 | == SCI_BASE_CONTROLLER_STATE_INITIALIZING) | 2555 | state == SCI_BASE_CONTROLLER_STATE_INITIALIZED) { |
2556 | || (scic->parent.state_machine.current_state_id | ||
2557 | == SCI_BASE_CONTROLLER_STATE_INITIALIZED) | ||
2558 | ) { | ||
2559 | u16 index; | 2556 | u16 index; |
2560 | 2557 | ||
2561 | /* | 2558 | /* |
2562 | * Validate the user parameters. If they are not legal, then | 2559 | * Validate the user parameters. If they are not legal, then |
2563 | * return a failure. */ | 2560 | * return a failure. |
2561 | */ | ||
2564 | for (index = 0; index < SCI_MAX_PHYS; index++) { | 2562 | for (index = 0; index < SCI_MAX_PHYS; index++) { |
2565 | if (!(scic_parms->sds1.phys[index].max_speed_generation | 2563 | struct sci_phy_user_params *user_phy; |
2566 | <= SCIC_SDS_PARM_MAX_SPEED | 2564 | |
2567 | && scic_parms->sds1.phys[index].max_speed_generation | 2565 | user_phy = &scic_parms->sds1.phys[index]; |
2568 | > SCIC_SDS_PARM_NO_SPEED)) | 2566 | |
2567 | if (!((user_phy->max_speed_generation <= | ||
2568 | SCIC_SDS_PARM_MAX_SPEED) && | ||
2569 | (user_phy->max_speed_generation > | ||
2570 | SCIC_SDS_PARM_NO_SPEED))) | ||
2569 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2571 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2570 | 2572 | ||
2571 | if (scic_parms->sds1.phys[index].in_connection_align_insertion_frequency < 3) | 2573 | if (user_phy->in_connection_align_insertion_frequency < |
2574 | 3) | ||
2572 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2575 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2573 | if ( | 2576 | |
2574 | (scic_parms->sds1.phys[index].in_connection_align_insertion_frequency < 3) || | 2577 | if ((user_phy->in_connection_align_insertion_frequency < |
2575 | (scic_parms->sds1.phys[index].align_insertion_frequency == 0) || | 2578 | 3) || |
2576 | (scic_parms->sds1.phys[index].notify_enable_spin_up_insertion_frequency == 0) | 2579 | (user_phy->align_insertion_frequency == 0) || |
2577 | ) | 2580 | (user_phy-> |
2581 | notify_enable_spin_up_insertion_frequency == | ||
2582 | 0)) | ||
2578 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2583 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2579 | } | 2584 | } |
2580 | 2585 | ||
2581 | if ((scic_parms->sds1.stp_inactivity_timeout == 0) || | 2586 | if ((scic_parms->sds1.stp_inactivity_timeout == 0) || |
2582 | (scic_parms->sds1.ssp_inactivity_timeout == 0) || | 2587 | (scic_parms->sds1.ssp_inactivity_timeout == 0) || |
2583 | (scic_parms->sds1.stp_max_occupancy_timeout == 0) || | 2588 | (scic_parms->sds1.stp_max_occupancy_timeout == 0) || |
2584 | (scic_parms->sds1.ssp_max_occupancy_timeout == 0) || | 2589 | (scic_parms->sds1.ssp_max_occupancy_timeout == 0) || |
2585 | (scic_parms->sds1.no_outbound_task_timeout == 0)) | 2590 | (scic_parms->sds1.no_outbound_task_timeout == 0)) |
2586 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2591 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2587 | 2592 | ||
2588 | memcpy(&scic->user_parameters, scic_parms, sizeof(*scic_parms)); | 2593 | memcpy(&scic->user_parameters, scic_parms, sizeof(*scic_parms)); |
@@ -2620,36 +2625,34 @@ enum sci_status scic_oem_parameters_set( | |||
2620 | * Validate the oem parameters. If they are not legal, then | 2625 | * Validate the oem parameters. If they are not legal, then |
2621 | * return a failure. */ | 2626 | * return a failure. */ |
2622 | for (index = 0; index < SCI_MAX_PORTS; index++) { | 2627 | for (index = 0; index < SCI_MAX_PORTS; index++) { |
2623 | if (scic_parms->sds1.ports[index].phy_mask > SCIC_SDS_PARM_PHY_MASK_MAX) { | 2628 | if (scic_parms->sds1.ports[index].phy_mask > SCIC_SDS_PARM_PHY_MASK_MAX) |
2624 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2629 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2625 | } | ||
2626 | } | 2630 | } |
2627 | 2631 | ||
2628 | for (index = 0; index < SCI_MAX_PHYS; index++) { | 2632 | for (index = 0; index < SCI_MAX_PHYS; index++) { |
2629 | if ( | 2633 | if ((scic_parms->sds1.phys[index].sas_address.high == 0) && |
2630 | scic_parms->sds1.phys[index].sas_address.high == 0 | 2634 | (scic_parms->sds1.phys[index].sas_address.low == 0)) |
2631 | && scic_parms->sds1.phys[index].sas_address.low == 0 | ||
2632 | ) { | ||
2633 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2635 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2634 | } | ||
2635 | } | 2636 | } |
2636 | 2637 | ||
2637 | if (scic_parms->sds1.controller.mode_type == SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE) { | 2638 | if (scic_parms->sds1.controller.mode_type == |
2639 | SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE) { | ||
2638 | for (index = 0; index < SCI_MAX_PHYS; index++) { | 2640 | for (index = 0; index < SCI_MAX_PHYS; index++) { |
2639 | if (scic_parms->sds1.ports[index].phy_mask != 0) | 2641 | if (scic_parms->sds1.ports[index].phy_mask != 0) |
2640 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2642 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2641 | } | 2643 | } |
2642 | } else if (scic_parms->sds1.controller.mode_type == SCIC_PORT_MANUAL_CONFIGURATION_MODE) { | 2644 | } else if (scic_parms->sds1.controller.mode_type == |
2645 | SCIC_PORT_MANUAL_CONFIGURATION_MODE) { | ||
2643 | for (index = 0; index < SCI_MAX_PHYS; index++) | 2646 | for (index = 0; index < SCI_MAX_PHYS; index++) |
2644 | combined_phy_mask |= scic_parms->sds1.ports[index].phy_mask; | 2647 | combined_phy_mask |= scic_parms->sds1.ports[index].phy_mask; |
2645 | 2648 | ||
2646 | if (combined_phy_mask == 0) | 2649 | if (combined_phy_mask == 0) |
2647 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2650 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2648 | } else { | 2651 | } else |
2649 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2652 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2650 | } | ||
2651 | 2653 | ||
2652 | if (scic_parms->sds1.controller.max_concurrent_dev_spin_up > MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT) | 2654 | if (scic_parms->sds1.controller.max_concurrent_dev_spin_up > |
2655 | MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT) | ||
2653 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; | 2656 | return SCI_FAILURE_INVALID_PARAMETER_VALUE; |
2654 | 2657 | ||
2655 | scic->oem_parameters.sds1 = scic_parms->sds1; | 2658 | scic->oem_parameters.sds1 = scic_parms->sds1; |
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c index d6e2a73e797a..79515be5f7c1 100644 --- a/drivers/scsi/isci/host.c +++ b/drivers/scsi/isci/host.c | |||
@@ -413,6 +413,32 @@ static void __iomem *smu_base(struct isci_host *isci_host) | |||
413 | return pcim_iomap_table(pdev)[SCI_SMU_BAR * 2] + SCI_SMU_BAR_SIZE * id; | 413 | return pcim_iomap_table(pdev)[SCI_SMU_BAR * 2] + SCI_SMU_BAR_SIZE * id; |
414 | } | 414 | } |
415 | 415 | ||
416 | static void isci_user_parameters_get( | ||
417 | struct isci_host *isci_host, | ||
418 | union scic_user_parameters *scic_user_params) | ||
419 | { | ||
420 | struct scic_sds_user_parameters *u = &scic_user_params->sds1; | ||
421 | int i; | ||
422 | |||
423 | for (i = 0; i < SCI_MAX_PHYS; i++) { | ||
424 | struct sci_phy_user_params *u_phy = &u->phys[i]; | ||
425 | |||
426 | u_phy->max_speed_generation = phy_gen; | ||
427 | |||
428 | /* we are not exporting these for now */ | ||
429 | u_phy->align_insertion_frequency = 0x7f; | ||
430 | u_phy->in_connection_align_insertion_frequency = 0xff; | ||
431 | u_phy->notify_enable_spin_up_insertion_frequency = 0x33; | ||
432 | } | ||
433 | |||
434 | u->stp_inactivity_timeout = stp_inactive_to; | ||
435 | u->ssp_inactivity_timeout = ssp_inactive_to; | ||
436 | u->stp_max_occupancy_timeout = stp_max_occ_to; | ||
437 | u->ssp_max_occupancy_timeout = ssp_max_occ_to; | ||
438 | u->no_outbound_task_timeout = no_outbound_task_to; | ||
439 | u->max_number_concurrent_device_spin_up = max_concurr_spinup; | ||
440 | } | ||
441 | |||
416 | int isci_host_init(struct isci_host *isci_host) | 442 | int isci_host_init(struct isci_host *isci_host) |
417 | { | 443 | { |
418 | int err = 0, i; | 444 | int err = 0, i; |
@@ -462,7 +488,7 @@ int isci_host_init(struct isci_host *isci_host) | |||
462 | * grab initial values stored in the controller object for OEM and USER | 488 | * grab initial values stored in the controller object for OEM and USER |
463 | * parameters | 489 | * parameters |
464 | */ | 490 | */ |
465 | scic_user_parameters_get(controller, &scic_user_params); | 491 | isci_user_parameters_get(isci_host, &scic_user_params); |
466 | status = scic_user_parameters_set(isci_host->core_controller, | 492 | status = scic_user_parameters_set(isci_host->core_controller, |
467 | &scic_user_params); | 493 | &scic_user_params); |
468 | if (status != SCI_SUCCESS) { | 494 | if (status != SCI_SUCCESS) { |
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c index 51a7bce20dae..1b04b9c117a4 100644 --- a/drivers/scsi/isci/init.c +++ b/drivers/scsi/isci/init.c | |||
@@ -110,9 +110,37 @@ int isci_si_rev = ISCI_SI_REVA2; | |||
110 | #else | 110 | #else |
111 | int isci_si_rev = ISCI_SI_REVB0; | 111 | int isci_si_rev = ISCI_SI_REVB0; |
112 | #endif | 112 | #endif |
113 | module_param(isci_si_rev, int, S_IRUGO | S_IWUSR); | 113 | module_param(isci_si_rev, int, 0); |
114 | MODULE_PARM_DESC(isci_si_rev, "override default si rev (0: A0 1: A2 2: B0)"); | 114 | MODULE_PARM_DESC(isci_si_rev, "override default si rev (0: A0 1: A2 2: B0)"); |
115 | 115 | ||
116 | unsigned char no_outbound_task_to = 20; | ||
117 | module_param(no_outbound_task_to, byte, 0); | ||
118 | MODULE_PARM_DESC(no_outbound_task_to, "No Outbound Task Timeout (1us incr)"); | ||
119 | |||
120 | u16 ssp_max_occ_to = 20; | ||
121 | module_param(ssp_max_occ_to, ushort, 0); | ||
122 | MODULE_PARM_DESC(ssp_max_occ_to, "SSP Max occupancy timeout (100us incr)"); | ||
123 | |||
124 | u16 stp_max_occ_to = 5; | ||
125 | module_param(stp_max_occ_to, ushort, 0); | ||
126 | MODULE_PARM_DESC(stp_max_occ_to, "STP Max occupancy timeout (100us incr)"); | ||
127 | |||
128 | u16 ssp_inactive_to = 5; | ||
129 | module_param(ssp_inactive_to, ushort, 0); | ||
130 | MODULE_PARM_DESC(ssp_inactive_to, "SSP inactivity timeout (100us incr)"); | ||
131 | |||
132 | u16 stp_inactive_to = 5; | ||
133 | module_param(stp_inactive_to, ushort, 0); | ||
134 | MODULE_PARM_DESC(stp_inactive_to, "STP inactivity timeout (100us incr)"); | ||
135 | |||
136 | unsigned char phy_gen = 3; | ||
137 | module_param(phy_gen, byte, 0); | ||
138 | MODULE_PARM_DESC(phy_gen, "PHY generation (1: 1.5Gbps 2: 3.0Gbps 3: 6.0Gbps)"); | ||
139 | |||
140 | unsigned char max_concurr_spinup = 1; | ||
141 | module_param(max_concurr_spinup, byte, 0); | ||
142 | MODULE_PARM_DESC(max_concurr_spinup, "Max concurrent device spinup"); | ||
143 | |||
116 | static struct scsi_host_template isci_sht = { | 144 | static struct scsi_host_template isci_sht = { |
117 | 145 | ||
118 | .module = THIS_MODULE, | 146 | .module = THIS_MODULE, |
diff --git a/drivers/scsi/isci/isci.h b/drivers/scsi/isci/isci.h index 83422d43c1d3..a2df59c9e06d 100644 --- a/drivers/scsi/isci/isci.h +++ b/drivers/scsi/isci/isci.h | |||
@@ -75,6 +75,14 @@ | |||
75 | #include "task.h" | 75 | #include "task.h" |
76 | #include "sata.h" | 76 | #include "sata.h" |
77 | 77 | ||
78 | extern unsigned char no_outbound_task_to; | ||
79 | extern u16 ssp_max_occ_to; | ||
80 | extern u16 stp_max_occ_to; | ||
81 | extern u16 ssp_inactive_to; | ||
82 | extern u16 stp_inactive_to; | ||
83 | extern unsigned char phy_gen; | ||
84 | extern unsigned char max_concurr_spinup; | ||
85 | |||
78 | irqreturn_t isci_msix_isr(int vec, void *data); | 86 | irqreturn_t isci_msix_isr(int vec, void *data); |
79 | irqreturn_t isci_intx_isr(int vec, void *data); | 87 | irqreturn_t isci_intx_isr(int vec, void *data); |
80 | irqreturn_t isci_error_isr(int vec, void *data); | 88 | irqreturn_t isci_error_isr(int vec, void *data); |