|
@@ -147,13 +147,12 @@ void pciehp_queue_pushbutton_work(struct work_struct *work)
|
|
|
void pciehp_handle_button_press(struct slot *p_slot)
|
|
|
{
|
|
|
struct controller *ctrl = p_slot->ctrl;
|
|
|
- u8 getstatus;
|
|
|
|
|
|
mutex_lock(&p_slot->lock);
|
|
|
switch (p_slot->state) {
|
|
|
- case STATIC_STATE:
|
|
|
- pciehp_get_power_status(p_slot, &getstatus);
|
|
|
- if (getstatus) {
|
|
|
+ case OFF_STATE:
|
|
|
+ case ON_STATE:
|
|
|
+ if (p_slot->state == ON_STATE) {
|
|
|
p_slot->state = BLINKINGOFF_STATE;
|
|
|
ctrl_info(ctrl, "Slot(%s): Powering off due to button press\n",
|
|
|
slot_name(p_slot));
|
|
@@ -176,14 +175,16 @@ void pciehp_handle_button_press(struct slot *p_slot)
|
|
|
*/
|
|
|
ctrl_info(ctrl, "Slot(%s): Button cancel\n", slot_name(p_slot));
|
|
|
cancel_delayed_work(&p_slot->work);
|
|
|
- if (p_slot->state == BLINKINGOFF_STATE)
|
|
|
+ if (p_slot->state == BLINKINGOFF_STATE) {
|
|
|
+ p_slot->state = ON_STATE;
|
|
|
pciehp_green_led_on(p_slot);
|
|
|
- else
|
|
|
+ } else {
|
|
|
+ p_slot->state = OFF_STATE;
|
|
|
pciehp_green_led_off(p_slot);
|
|
|
+ }
|
|
|
pciehp_set_attention_status(p_slot, 0);
|
|
|
ctrl_info(ctrl, "Slot(%s): Action canceled due to button press\n",
|
|
|
slot_name(p_slot));
|
|
|
- p_slot->state = STATIC_STATE;
|
|
|
break;
|
|
|
case POWEROFF_STATE:
|
|
|
case POWERON_STATE:
|
|
@@ -216,7 +217,8 @@ void pciehp_handle_link_change(struct slot *p_slot)
|
|
|
case BLINKINGOFF_STATE:
|
|
|
cancel_delayed_work(&p_slot->work);
|
|
|
/* Fall through */
|
|
|
- case STATIC_STATE:
|
|
|
+ case ON_STATE:
|
|
|
+ case OFF_STATE:
|
|
|
if (link_active) {
|
|
|
p_slot->state = POWERON_STATE;
|
|
|
mutex_unlock(&p_slot->lock);
|
|
@@ -332,7 +334,7 @@ int pciehp_enable_slot(struct slot *slot)
|
|
|
pciehp_green_led_off(slot); /* may be blinking */
|
|
|
|
|
|
mutex_lock(&slot->lock);
|
|
|
- slot->state = STATIC_STATE;
|
|
|
+ slot->state = ret ? OFF_STATE : ON_STATE;
|
|
|
mutex_unlock(&slot->lock);
|
|
|
|
|
|
return ret;
|
|
@@ -368,7 +370,7 @@ int pciehp_disable_slot(struct slot *slot)
|
|
|
mutex_unlock(&slot->hotplug_lock);
|
|
|
|
|
|
mutex_lock(&slot->lock);
|
|
|
- slot->state = STATIC_STATE;
|
|
|
+ slot->state = OFF_STATE;
|
|
|
mutex_unlock(&slot->lock);
|
|
|
|
|
|
return ret;
|
|
@@ -382,7 +384,7 @@ int pciehp_sysfs_enable_slot(struct slot *p_slot)
|
|
|
switch (p_slot->state) {
|
|
|
case BLINKINGON_STATE:
|
|
|
cancel_delayed_work(&p_slot->work);
|
|
|
- case STATIC_STATE:
|
|
|
+ case OFF_STATE:
|
|
|
p_slot->state = POWERON_STATE;
|
|
|
mutex_unlock(&p_slot->lock);
|
|
|
return pciehp_enable_slot(p_slot);
|
|
@@ -391,6 +393,7 @@ int pciehp_sysfs_enable_slot(struct slot *p_slot)
|
|
|
slot_name(p_slot));
|
|
|
break;
|
|
|
case BLINKINGOFF_STATE:
|
|
|
+ case ON_STATE:
|
|
|
case POWEROFF_STATE:
|
|
|
ctrl_info(ctrl, "Slot(%s): Already enabled\n",
|
|
|
slot_name(p_slot));
|
|
@@ -413,7 +416,7 @@ int pciehp_sysfs_disable_slot(struct slot *p_slot)
|
|
|
switch (p_slot->state) {
|
|
|
case BLINKINGOFF_STATE:
|
|
|
cancel_delayed_work(&p_slot->work);
|
|
|
- case STATIC_STATE:
|
|
|
+ case ON_STATE:
|
|
|
p_slot->state = POWEROFF_STATE;
|
|
|
mutex_unlock(&p_slot->lock);
|
|
|
return pciehp_disable_slot(p_slot);
|
|
@@ -422,6 +425,7 @@ int pciehp_sysfs_disable_slot(struct slot *p_slot)
|
|
|
slot_name(p_slot));
|
|
|
break;
|
|
|
case BLINKINGON_STATE:
|
|
|
+ case OFF_STATE:
|
|
|
case POWERON_STATE:
|
|
|
ctrl_info(ctrl, "Slot(%s): Already disabled\n",
|
|
|
slot_name(p_slot));
|