diff options
Diffstat (limited to 'drivers/pci/hotplug/cpqphp_ctrl.c')
| -rw-r--r-- | drivers/pci/hotplug/cpqphp_ctrl.c | 117 | 
1 files changed, 41 insertions, 76 deletions
diff --git a/drivers/pci/hotplug/cpqphp_ctrl.c b/drivers/pci/hotplug/cpqphp_ctrl.c index e43908d9b5d..bde47fce324 100644 --- a/drivers/pci/hotplug/cpqphp_ctrl.c +++ b/drivers/pci/hotplug/cpqphp_ctrl.c @@ -39,9 +39,9 @@  #include <linux/kthread.h>  #include "cpqphp.h" -static u32 configure_new_device(struct controller* ctrl, struct pci_func *func, +static u32 configure_new_device(struct controller *ctrl, struct pci_func *func,  			u8 behind_bridge, struct resource_lists *resources); -static int configure_new_function(struct controller* ctrl, struct pci_func *func, +static int configure_new_function(struct controller *ctrl, struct pci_func *func,  			u8 behind_bridge, struct resource_lists *resources);  static void interrupt_event_handler(struct controller *ctrl); @@ -64,7 +64,7 @@ static void long_delay(int delay)  /* FIXME: The following line needs to be somewhere else... */  #define WRONG_BUS_FREQUENCY 0x07 -static u8 handle_switch_change(u8 change, struct controller * ctrl) +static u8 handle_switch_change(u8 change, struct controller *ctrl)  {  	int hp_slot;  	u8 rc = 0; @@ -138,7 +138,7 @@ static struct slot *cpqhp_find_slot(struct controller *ctrl, u8 device)  } -static u8 handle_presence_change(u16 change, struct controller * ctrl) +static u8 handle_presence_change(u16 change, struct controller *ctrl)  {  	int hp_slot;  	u8 rc = 0; @@ -232,7 +232,7 @@ static u8 handle_presence_change(u16 change, struct controller * ctrl)  } -static u8 handle_power_fault(u8 change, struct controller * ctrl) +static u8 handle_power_fault(u8 change, struct controller *ctrl)  {  	int hp_slot;  	u8 rc = 0; @@ -709,7 +709,8 @@ static struct pci_resource *get_max_resource(struct pci_resource **head, u32 siz  				temp = temp->next;  			} -			temp->next = max->next; +			if (temp) +				temp->next = max->next;  		}  		max->next = NULL; @@ -996,7 +997,7 @@ struct pci_func *cpqhp_slot_create(u8 busnumber)   *   * Returns %0 if successful, !0 otherwise.   */ -static int slot_remove(struct pci_func * old_slot) +static int slot_remove(struct pci_func *old_slot)  {  	struct pci_func *next; @@ -1108,7 +1109,7 @@ struct pci_func *cpqhp_slot_find(u8 bus, u8 device, u8 index)  /* DJZ: I don't think is_bridge will work as is.   * FIXME */ -static int is_bridge(struct pci_func * func) +static int is_bridge(struct pci_func *func)  {  	/* Check the header type */  	if (((func->config_space[0x03] >> 16) & 0xFF) == 0x01) @@ -1231,7 +1232,7 @@ static u8 set_controller_speed(struct controller *ctrl, u8 adapter_speed, u8 hp_  	/* Only if mode change...*/  	if (((bus->cur_bus_speed == PCI_SPEED_66MHz) && (adapter_speed == PCI_SPEED_66MHz_PCIX)) || -		((bus->cur_bus_speed == PCI_SPEED_66MHz_PCIX) && (adapter_speed == PCI_SPEED_66MHz)))  +		((bus->cur_bus_speed == PCI_SPEED_66MHz_PCIX) && (adapter_speed == PCI_SPEED_66MHz)))  			set_SOGO(ctrl);  	wait_for_ctrl_irq(ctrl); @@ -1624,7 +1625,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl)   * @replace_flag: whether replacing or adding a new device   * @ctrl: target controller   */ -static u32 remove_board(struct pci_func * func, u32 replace_flag, struct controller * ctrl) +static u32 remove_board(struct pci_func *func, u32 replace_flag, struct controller *ctrl)  {  	int index;  	u8 skip = 0; @@ -1741,7 +1742,7 @@ static void pushbutton_helper_thread(unsigned long data)  /* this is the main worker thread */ -static int event_thread(void* data) +static int event_thread(void *data)  {  	struct controller *ctrl; @@ -1828,7 +1829,7 @@ static void interrupt_event_handler(struct controller *ctrl)  				if (ctrl->event_queue[loop].event_type == INT_BUTTON_PRESS) {  					dbg("button pressed\n"); -				} else if (ctrl->event_queue[loop].event_type ==  +				} else if (ctrl->event_queue[loop].event_type ==  					   INT_BUTTON_CANCEL) {  					dbg("button cancel\n");  					del_timer(&p_slot->task_event); @@ -1900,8 +1901,7 @@ static void interrupt_event_handler(struct controller *ctrl)  					dbg("power fault\n");  				} else {  					/* refresh notification */ -					if (p_slot) -						update_slot_info(ctrl, p_slot); +					update_slot_info(ctrl, p_slot);  				}  				ctrl->event_queue[loop].event_type = 0; @@ -1992,7 +1992,7 @@ int cpqhp_process_SI(struct controller *ctrl, struct pci_func *func)  	u16 temp_word;  	u32 tempdword;  	int rc; -	struct slot* p_slot; +	struct slot *p_slot;  	int physical_slot = 0;  	tempdword = 0; @@ -2088,7 +2088,7 @@ int cpqhp_process_SS(struct controller *ctrl, struct pci_func *func)  	u8 replace_flag;  	u32 rc = 0;  	unsigned int devfn; -	struct slot* p_slot; +	struct slot *p_slot;  	struct pci_bus *pci_bus = ctrl->pci_bus;  	int physical_slot=0; @@ -2270,8 +2270,8 @@ int cpqhp_hardware_test(struct controller *ctrl, int test_num)   *   * Returns 0 if success.   */ -static u32 configure_new_device(struct controller * ctrl, struct pci_func * func, -				 u8 behind_bridge, struct resource_lists * resources) +static u32 configure_new_device(struct controller  *ctrl, struct pci_func  *func, +				 u8 behind_bridge, struct resource_lists  *resources)  {  	u8 temp_byte, function, max_functions, stop_it;  	int rc; @@ -2412,11 +2412,11 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func  		if (rc)  			return rc; -		/* find range of busses to use */ +		/* find range of buses to use */  		dbg("find ranges of buses to use\n");  		bus_node = get_max_resource(&(resources->bus_head), 1); -		/* If we don't have any busses to allocate, we can't continue */ +		/* If we don't have any buses to allocate, we can't continue */  		if (!bus_node)  			return -ENOMEM; @@ -2520,44 +2520,28 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func  		/* If we have IO resources copy them and fill in the bridge's  		 * IO range registers */ -		if (io_node) { -			memcpy(hold_IO_node, io_node, sizeof(struct pci_resource)); -			io_node->next = NULL; - -			/* set IO base and Limit registers */ -			temp_byte = io_node->base >> 8; -			rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_BASE, temp_byte); - -			temp_byte = (io_node->base + io_node->length - 1) >> 8; -			rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_LIMIT, temp_byte); -		} else { -			kfree(hold_IO_node); -			hold_IO_node = NULL; -		} +		memcpy(hold_IO_node, io_node, sizeof(struct pci_resource)); +		io_node->next = NULL; -		/* If we have memory resources copy them and fill in the -		 * bridge's memory range registers.  Otherwise, fill in the -		 * range registers with values that disable them. */ -		if (mem_node) { -			memcpy(hold_mem_node, mem_node, sizeof(struct pci_resource)); -			mem_node->next = NULL; +		/* set IO base and Limit registers */ +		temp_byte = io_node->base >> 8; +		rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_BASE, temp_byte); -			/* set Mem base and Limit registers */ -			temp_word = mem_node->base >> 16; -			rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_BASE, temp_word); +		temp_byte = (io_node->base + io_node->length - 1) >> 8; +		rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_LIMIT, temp_byte); -			temp_word = (mem_node->base + mem_node->length - 1) >> 16; -			rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word); -		} else { -			temp_word = 0xFFFF; -			rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_BASE, temp_word); +		/* Copy the memory resources and fill in the bridge's memory +		 * range registers. +		 */ +		memcpy(hold_mem_node, mem_node, sizeof(struct pci_resource)); +		mem_node->next = NULL; -			temp_word = 0x0000; -			rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word); +		/* set Mem base and Limit registers */ +		temp_word = mem_node->base >> 16; +		rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_BASE, temp_word); -			kfree(hold_mem_node); -			hold_mem_node = NULL; -		} +		temp_word = (mem_node->base + mem_node->length - 1) >> 16; +		rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word);  		memcpy(hold_p_mem_node, p_mem_node, sizeof(struct pci_resource));  		p_mem_node->next = NULL; @@ -2627,7 +2611,7 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func  		/* Return unused bus resources  		 * First use the temporary node to store information for  		 * the board */ -		if (hold_bus_node && bus_node && temp_resources.bus_head) { +		if (bus_node && temp_resources.bus_head) {  			hold_bus_node->length = bus_node->base - hold_bus_node->base;  			hold_bus_node->next = func->bus_head; @@ -2751,7 +2735,7 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func  		}  		/* If we have prefetchable memory space available and there  		 * is some left at the end, return the unused portion */ -		if (hold_p_mem_node && temp_resources.p_mem_head) { +		if (temp_resources.p_mem_head) {  			p_mem_node = do_pre_bridge_resource_split(&(temp_resources.p_mem_head),  								  &hold_p_mem_node, 0x100000); @@ -2890,27 +2874,8 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func  						func->mem_head = mem_node;  					} else  						return -ENOMEM; -				} else if ((temp_register & 0x0BL) == 0x04) { -					/* Map memory */ -					base = temp_register & 0xFFFFFFF0; -					base = ~base + 1; - -					dbg("CND:      length = 0x%x\n", base); -					mem_node = get_resource(&(resources->mem_head), base); - -					/* allocate the resource to the board */ -					if (mem_node) { -						base = mem_node->base; - -						mem_node->next = func->mem_head; -						func->mem_head = mem_node; -					} else -						return -ENOMEM; -				} else if ((temp_register & 0x0BL) == 0x06) { -					/* Those bits are reserved, we can't handle this */ -					return 1;  				} else { -					/* Requesting space below 1M */ +					/* Reserved bits or requesting space below 1M */  					return NOT_ENOUGH_RESOURCES;  				} @@ -2936,7 +2901,7 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func  			/* If this function needs an interrupt and we are behind  			 * a bridge and the pin is tied to something that's -			 * alread mapped, set this one the same */ +			 * already mapped, set this one the same */  			if (temp_byte && resources->irqs &&  			    (resources->irqs->valid_INT &  			     (0x01 << ((temp_byte + resources->irqs->barber_pole - 1) & 0x03)))) {  | 
