[SCSI] isci: overriding max_concurr_spinup oem parameter by max(oem, user)
authorAndrzej Jakowski <andrzej.jakowski@intel.com>
Thu, 27 Oct 2011 22:05:42 +0000 (15:05 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 31 Oct 2011 09:23:18 +0000 (13:23 +0400)
Fixes bug where max_concurr_spinup oem parameter should be
overriden by max_concurr_spinup user parameter. Override should
happen only when max_concurr_spinup user parameter is specified
in command line (greater than 0). Also this fix shortens variables
representing max_conxurr_spinup for oem and user parameters.

Signed-off-by: Andrzej Jakowski <andrzej.jakowski@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/isci/host.c
drivers/scsi/isci/init.c
drivers/scsi/isci/probe_roms.h

index f07f30f..e7fe9c4 100644 (file)
@@ -1350,7 +1350,7 @@ static void isci_user_parameters_get(struct sci_user_parameters *u)
        u->stp_max_occupancy_timeout = stp_max_occ_to;
        u->ssp_max_occupancy_timeout = ssp_max_occ_to;
        u->no_outbound_task_timeout = no_outbound_task_to;
-       u->max_number_concurrent_device_spin_up = max_concurr_spinup;
+       u->max_concurr_spinup = max_concurr_spinup;
 }
 
 static void sci_controller_initial_state_enter(struct sci_base_state_machine *sm)
@@ -1661,7 +1661,7 @@ static void sci_controller_set_default_config_parameters(struct isci_host *ihost
        ihost->oem_parameters.controller.mode_type = SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE;
 
        /* Default to APC mode. */
-       ihost->oem_parameters.controller.max_concurrent_dev_spin_up = 1;
+       ihost->oem_parameters.controller.max_concurr_spin_up = 1;
 
        /* Default to no SSC operation. */
        ihost->oem_parameters.controller.do_enable_ssc = false;
@@ -1787,7 +1787,8 @@ int sci_oem_parameters_validate(struct sci_oem_params *oem)
        } else
                return -EINVAL;
 
-       if (oem->controller.max_concurrent_dev_spin_up > MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT)
+       if (oem->controller.max_concurr_spin_up > MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT ||
+           oem->controller.max_concurr_spin_up < 1)
                return -EINVAL;
 
        return 0;
@@ -1810,6 +1811,16 @@ static enum sci_status sci_oem_parameters_set(struct isci_host *ihost)
        return SCI_FAILURE_INVALID_STATE;
 }
 
+static u8 max_spin_up(struct isci_host *ihost)
+{
+       if (ihost->user_parameters.max_concurr_spinup)
+               return min_t(u8, ihost->user_parameters.max_concurr_spinup,
+                            MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT);
+       else
+               return min_t(u8, ihost->oem_parameters.controller.max_concurr_spin_up,
+                            MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT);
+}
+
 static void power_control_timeout(unsigned long data)
 {
        struct sci_timer *tmr = (struct sci_timer *)data;
@@ -1839,8 +1850,7 @@ static void power_control_timeout(unsigned long data)
                if (iphy == NULL)
                        continue;
 
-               if (ihost->power_control.phys_granted_power >=
-                   ihost->oem_parameters.controller.max_concurrent_dev_spin_up)
+               if (ihost->power_control.phys_granted_power >= max_spin_up(ihost))
                        break;
 
                ihost->power_control.requesters[i] = NULL;
@@ -1865,8 +1875,7 @@ void sci_controller_power_control_queue_insert(struct isci_host *ihost,
 {
        BUG_ON(iphy == NULL);
 
-       if (ihost->power_control.phys_granted_power <
-           ihost->oem_parameters.controller.max_concurrent_dev_spin_up) {
+       if (ihost->power_control.phys_granted_power < max_spin_up(ihost)) {
                ihost->power_control.phys_granted_power++;
                sci_phy_consume_power_handler(iphy);
 
index 43fe840..a97edab 100644 (file)
@@ -118,7 +118,7 @@ unsigned char phy_gen = 3;
 module_param(phy_gen, byte, 0);
 MODULE_PARM_DESC(phy_gen, "PHY generation (1: 1.5Gbps 2: 3.0Gbps 3: 6.0Gbps)");
 
-unsigned char max_concurr_spinup = 1;
+unsigned char max_concurr_spinup;
 module_param(max_concurr_spinup, byte, 0);
 MODULE_PARM_DESC(max_concurr_spinup, "Max concurrent device spinup");
 
index dc007e6..2c75248 100644 (file)
@@ -112,7 +112,7 @@ struct sci_user_parameters {
         * This field specifies the maximum number of direct attached devices
         * that can have power supplied to them simultaneously.
         */
-       u8 max_number_concurrent_device_spin_up;
+       u8 max_concurr_spinup;
 
        /**
         * This field specifies the number of seconds to allow a phy to consume
@@ -219,7 +219,7 @@ struct sci_bios_oem_param_block_hdr {
 struct sci_oem_params {
        struct {
                uint8_t mode_type;
-               uint8_t max_concurrent_dev_spin_up;
+               uint8_t max_concurr_spin_up;
                uint8_t do_enable_ssc;
                uint8_t reserved;
        } controller;