aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/isci/core/scic_sds_controller.c73
-rw-r--r--drivers/scsi/isci/host.c28
-rw-r--r--drivers/scsi/isci/init.c30
-rw-r--r--drivers/scsi/isci/isci.h8
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
416static 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
416int isci_host_init(struct isci_host *isci_host) 442int 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
111int isci_si_rev = ISCI_SI_REVB0; 111int isci_si_rev = ISCI_SI_REVB0;
112#endif 112#endif
113module_param(isci_si_rev, int, S_IRUGO | S_IWUSR); 113module_param(isci_si_rev, int, 0);
114MODULE_PARM_DESC(isci_si_rev, "override default si rev (0: A0 1: A2 2: B0)"); 114MODULE_PARM_DESC(isci_si_rev, "override default si rev (0: A0 1: A2 2: B0)");
115 115
116unsigned char no_outbound_task_to = 20;
117module_param(no_outbound_task_to, byte, 0);
118MODULE_PARM_DESC(no_outbound_task_to, "No Outbound Task Timeout (1us incr)");
119
120u16 ssp_max_occ_to = 20;
121module_param(ssp_max_occ_to, ushort, 0);
122MODULE_PARM_DESC(ssp_max_occ_to, "SSP Max occupancy timeout (100us incr)");
123
124u16 stp_max_occ_to = 5;
125module_param(stp_max_occ_to, ushort, 0);
126MODULE_PARM_DESC(stp_max_occ_to, "STP Max occupancy timeout (100us incr)");
127
128u16 ssp_inactive_to = 5;
129module_param(ssp_inactive_to, ushort, 0);
130MODULE_PARM_DESC(ssp_inactive_to, "SSP inactivity timeout (100us incr)");
131
132u16 stp_inactive_to = 5;
133module_param(stp_inactive_to, ushort, 0);
134MODULE_PARM_DESC(stp_inactive_to, "STP inactivity timeout (100us incr)");
135
136unsigned char phy_gen = 3;
137module_param(phy_gen, byte, 0);
138MODULE_PARM_DESC(phy_gen, "PHY generation (1: 1.5Gbps 2: 3.0Gbps 3: 6.0Gbps)");
139
140unsigned char max_concurr_spinup = 1;
141module_param(max_concurr_spinup, byte, 0);
142MODULE_PARM_DESC(max_concurr_spinup, "Max concurrent device spinup");
143
116static struct scsi_host_template isci_sht = { 144static 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
78extern unsigned char no_outbound_task_to;
79extern u16 ssp_max_occ_to;
80extern u16 stp_max_occ_to;
81extern u16 ssp_inactive_to;
82extern u16 stp_inactive_to;
83extern unsigned char phy_gen;
84extern unsigned char max_concurr_spinup;
85
78irqreturn_t isci_msix_isr(int vec, void *data); 86irqreturn_t isci_msix_isr(int vec, void *data);
79irqreturn_t isci_intx_isr(int vec, void *data); 87irqreturn_t isci_intx_isr(int vec, void *data);
80irqreturn_t isci_error_isr(int vec, void *data); 88irqreturn_t isci_error_isr(int vec, void *data);