aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDave Jiang <dave.jiang@intel.com>2011-03-16 17:57:23 -0400
committerDan Williams <dan.j.williams@intel.com>2011-07-03 06:58:14 -0400
commitb5f18a201ed82ed3776c9950646689b93713ae57 (patch)
treeac393f2212c942b87539d99e985d498ad2b8ad39 /drivers
parent4711ba10b13891edf228944a9d0a21dfe7fe90f0 (diff)
isci: exposing user parameters via module params
Exposing the user config parameters through the kernel module parameters. The kernel module params will have the default values set and we will no longer pulling the default values for user params from the core. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers')
-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);