diff options
Diffstat (limited to 'drivers/pci/hotplug/rpaphp_slot.c')
-rw-r--r-- | drivers/pci/hotplug/rpaphp_slot.c | 49 |
1 files changed, 6 insertions, 43 deletions
diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c index 3009193f0058..d4ee8723fcb3 100644 --- a/drivers/pci/hotplug/rpaphp_slot.c +++ b/drivers/pci/hotplug/rpaphp_slot.c | |||
@@ -56,7 +56,6 @@ static struct hotplug_slot_attribute php_attr_location = { | |||
56 | static void rpaphp_release_slot(struct hotplug_slot *hotplug_slot) | 56 | static void rpaphp_release_slot(struct hotplug_slot *hotplug_slot) |
57 | { | 57 | { |
58 | struct slot *slot = (struct slot *) hotplug_slot->private; | 58 | struct slot *slot = (struct slot *) hotplug_slot->private; |
59 | |||
60 | dealloc_slot_struct(slot); | 59 | dealloc_slot_struct(slot); |
61 | } | 60 | } |
62 | 61 | ||
@@ -65,12 +64,12 @@ void dealloc_slot_struct(struct slot *slot) | |||
65 | kfree(slot->hotplug_slot->info); | 64 | kfree(slot->hotplug_slot->info); |
66 | kfree(slot->hotplug_slot->name); | 65 | kfree(slot->hotplug_slot->name); |
67 | kfree(slot->hotplug_slot); | 66 | kfree(slot->hotplug_slot); |
67 | kfree(slot->location); | ||
68 | kfree(slot); | 68 | kfree(slot); |
69 | return; | ||
70 | } | 69 | } |
71 | 70 | ||
72 | struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_name, | 71 | struct slot *alloc_slot_struct(struct device_node *dn, |
73 | int power_domain) | 72 | int drc_index, char *drc_name, int power_domain) |
74 | { | 73 | { |
75 | struct slot *slot; | 74 | struct slot *slot; |
76 | 75 | ||
@@ -115,7 +114,7 @@ error_nomem: | |||
115 | 114 | ||
116 | static int is_registered(struct slot *slot) | 115 | static int is_registered(struct slot *slot) |
117 | { | 116 | { |
118 | struct slot *tmp_slot; | 117 | struct slot *tmp_slot; |
119 | 118 | ||
120 | list_for_each_entry(tmp_slot, &rpaphp_slot_head, rpaphp_slot_list) { | 119 | list_for_each_entry(tmp_slot, &rpaphp_slot_head, rpaphp_slot_list) { |
121 | if (!strcmp(tmp_slot->name, slot->name)) | 120 | if (!strcmp(tmp_slot->name, slot->name)) |
@@ -140,8 +139,6 @@ int rpaphp_deregister_slot(struct slot *slot) | |||
140 | retval = pci_hp_deregister(php_slot); | 139 | retval = pci_hp_deregister(php_slot); |
141 | if (retval) | 140 | if (retval) |
142 | err("Problem unregistering a slot %s\n", slot->name); | 141 | err("Problem unregistering a slot %s\n", slot->name); |
143 | else | ||
144 | num_slots--; | ||
145 | 142 | ||
146 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); | 143 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); |
147 | return retval; | 144 | return retval; |
@@ -160,14 +157,13 @@ int rpaphp_register_slot(struct slot *slot) | |||
160 | /* should not try to register the same slot twice */ | 157 | /* should not try to register the same slot twice */ |
161 | if (is_registered(slot)) { | 158 | if (is_registered(slot)) { |
162 | err("rpaphp_register_slot: slot[%s] is already registered\n", slot->name); | 159 | err("rpaphp_register_slot: slot[%s] is already registered\n", slot->name); |
163 | retval = -EAGAIN; | 160 | return -EAGAIN; |
164 | goto register_fail; | ||
165 | } | 161 | } |
166 | 162 | ||
167 | retval = pci_hp_register(php_slot); | 163 | retval = pci_hp_register(php_slot); |
168 | if (retval) { | 164 | if (retval) { |
169 | err("pci_hp_register failed with error %d\n", retval); | 165 | err("pci_hp_register failed with error %d\n", retval); |
170 | goto register_fail; | 166 | return retval; |
171 | } | 167 | } |
172 | 168 | ||
173 | /* create "phy_location" file */ | 169 | /* create "phy_location" file */ |
@@ -181,43 +177,10 @@ int rpaphp_register_slot(struct slot *slot) | |||
181 | list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); | 177 | list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); |
182 | info("Slot [%s](PCI location=%s) registered\n", slot->name, | 178 | info("Slot [%s](PCI location=%s) registered\n", slot->name, |
183 | slot->location); | 179 | slot->location); |
184 | num_slots++; | ||
185 | return 0; | 180 | return 0; |
186 | 181 | ||
187 | sysfs_fail: | 182 | sysfs_fail: |
188 | pci_hp_deregister(php_slot); | 183 | pci_hp_deregister(php_slot); |
189 | register_fail: | ||
190 | rpaphp_release_slot(php_slot); | ||
191 | return retval; | 184 | return retval; |
192 | } | 185 | } |
193 | 186 | ||
194 | int rpaphp_get_power_status(struct slot *slot, u8 * value) | ||
195 | { | ||
196 | int rc = 0, level; | ||
197 | |||
198 | rc = rtas_get_power_level(slot->power_domain, &level); | ||
199 | if (rc < 0) { | ||
200 | err("failed to get power-level for slot(%s), rc=0x%x\n", | ||
201 | slot->location, rc); | ||
202 | return rc; | ||
203 | } | ||
204 | |||
205 | dbg("%s the power level of slot %s(pwd-domain:0x%x) is %d\n", | ||
206 | __FUNCTION__, slot->name, slot->power_domain, level); | ||
207 | *value = level; | ||
208 | |||
209 | return rc; | ||
210 | } | ||
211 | |||
212 | int rpaphp_set_attention_status(struct slot *slot, u8 status) | ||
213 | { | ||
214 | int rc; | ||
215 | |||
216 | /* status: LED_OFF or LED_ON */ | ||
217 | rc = rtas_set_indicator(DR_INDICATOR, slot->index, status); | ||
218 | if (rc < 0) | ||
219 | err("slot(name=%s location=%s index=0x%x) set attention-status(%d) failed! rc=0x%x\n", | ||
220 | slot->name, slot->location, slot->index, status, rc); | ||
221 | |||
222 | return rc; | ||
223 | } | ||