patch-2.4.21 linux-2.4.21/drivers/hotplug/cpqphp_ctrl.c
Next file: linux-2.4.21/drivers/hotplug/ibmphp_ebda.c
Previous file: linux-2.4.21/drivers/hotplug/cpqphp_core.c
Back to the patch index
Back to the overall index
- Lines: 247
- Date:
2003-06-13 07:51:33.000000000 -0700
- Orig file:
linux-2.4.20/drivers/hotplug/cpqphp_ctrl.c
- Orig date:
2002-11-28 15:53:12.000000000 -0800
diff -urN linux-2.4.20/drivers/hotplug/cpqphp_ctrl.c linux-2.4.21/drivers/hotplug/cpqphp_ctrl.c
@@ -135,9 +135,9 @@
/*
- * find_slot
+ * cpqhp_find_slot
*/
-static inline struct slot *find_slot (struct controller * ctrl, u8 device)
+struct slot *cpqhp_find_slot (struct controller * ctrl, u8 device)
{
struct slot *slot;
@@ -186,7 +186,7 @@
rc++;
- p_slot = find_slot(ctrl, hp_slot + (readb(ctrl->hpc_reg + SLOT_MASK) >> 4));
+ p_slot = cpqhp_find_slot(ctrl, hp_slot + (readb(ctrl->hpc_reg + SLOT_MASK) >> 4));
// If the switch closed, must be a button
// If not in button mode, nevermind
@@ -916,6 +916,7 @@
void cpqhp_ctrl_intr(int IRQ, struct controller * ctrl, struct pt_regs *regs)
{
u8 schedule_flag = 0;
+ u8 reset;
u16 misc;
u32 Diff;
u32 temp_dword;
@@ -966,6 +967,15 @@
schedule_flag += handle_presence_change((u16)((Diff & 0xFFFF0000L) >> 16), ctrl);
schedule_flag += handle_power_fault((u8)((Diff & 0xFF00L) >> 8), ctrl);
}
+
+ reset = readb(ctrl->hpc_reg + RESET_FREQ_MODE);
+ if (reset & 0x40) {
+ /* Bus Reset has completed */
+ reset &= 0xCF;
+ writeb(reset, ctrl->hpc_reg + RESET_FREQ_MODE);
+ reset = readb(ctrl->hpc_reg + RESET_FREQ_MODE);
+ wake_up_interruptible(&ctrl->queue);
+ }
if (schedule_flag) {
up(&event_semaphore);
@@ -1169,6 +1179,7 @@
{
u8 hp_slot;
u8 temp_byte;
+ u8 adapter_speed;
u32 index;
u32 rc = 0;
u32 src = 8;
@@ -1186,46 +1197,47 @@
//*********************************
rc = CARD_FUNCTIONING;
} else {
- if (ctrl->speed == PCI_SPEED_66MHz) {
- // Wait for exclusive access to hardware
- down(&ctrl->crit_sect);
-
- // turn on board without attaching to the bus
- enable_slot_power (ctrl, hp_slot);
+ // Wait for exclusive access to hardware
+ down(&ctrl->crit_sect);
- set_SOGO(ctrl);
+ // turn on board without attaching to the bus
+ enable_slot_power (ctrl, hp_slot);
- // Wait for SOBS to be unset
- wait_for_ctrl_irq (ctrl);
+ set_SOGO(ctrl);
- // Change bits in slot power register to force another shift out
- // NOTE: this is to work around the timer bug
- temp_byte = readb(ctrl->hpc_reg + SLOT_POWER);
- writeb(0x00, ctrl->hpc_reg + SLOT_POWER);
- writeb(temp_byte, ctrl->hpc_reg + SLOT_POWER);
+ // Wait for SOBS to be unset
+ wait_for_ctrl_irq (ctrl);
- set_SOGO(ctrl);
+ // Change bits in slot power register to force another shift out
+ // NOTE: this is to work around the timer bug
+ temp_byte = readb(ctrl->hpc_reg + SLOT_POWER);
+ writeb(0x00, ctrl->hpc_reg + SLOT_POWER);
+ writeb(temp_byte, ctrl->hpc_reg + SLOT_POWER);
- // Wait for SOBS to be unset
- wait_for_ctrl_irq (ctrl);
+ set_SOGO(ctrl);
- if (!(readl(ctrl->hpc_reg + NON_INT_INPUT) & (0x01 << hp_slot))) {
+ // Wait for SOBS to be unset
+ wait_for_ctrl_irq (ctrl);
+
+ // 66MHz and/or PCI-X support check
+ adapter_speed = get_adapter_speed(ctrl, hp_slot);
+ if (ctrl->speed != adapter_speed)
+ if (set_controller_speed(ctrl, adapter_speed, hp_slot))
rc = WRONG_BUS_FREQUENCY;
- }
- // turn off board without attaching to the bus
- disable_slot_power (ctrl, hp_slot);
- set_SOGO(ctrl);
+ // turn off board without attaching to the bus
+ disable_slot_power (ctrl, hp_slot);
- // Wait for SOBS to be unset
- wait_for_ctrl_irq (ctrl);
+ set_SOGO(ctrl);
- // Done with exclusive hardware access
- up(&ctrl->crit_sect);
+ // Wait for SOBS to be unset
+ wait_for_ctrl_irq (ctrl);
- if (rc)
- return(rc);
- }
+ // Done with exclusive hardware access
+ up(&ctrl->crit_sect);
+
+ if (rc)
+ return(rc);
// Wait for exclusive access to hardware
down(&ctrl->crit_sect);
@@ -1373,6 +1385,7 @@
{
u8 hp_slot;
u8 temp_byte;
+ u8 adapter_speed;
int index;
u32 temp_register = 0xFFFFFFFF;
u32 rc = 0;
@@ -1383,48 +1396,50 @@
hp_slot = func->device - ctrl->slot_device_offset;
dbg(__FUNCTION__": func->device, slot_offset, hp_slot = %d, %d ,%d\n",
func->device, ctrl->slot_device_offset, hp_slot);
+
+ // Wait for exclusive access to hardware
+ down(&ctrl->crit_sect);
- if (ctrl->speed == PCI_SPEED_66MHz) {
- // Wait for exclusive access to hardware
- down(&ctrl->crit_sect);
-
- // turn on board without attaching to the bus
- enable_slot_power (ctrl, hp_slot);
-
- set_SOGO(ctrl);
+ // turn on board without attaching to the bus
+ enable_slot_power (ctrl, hp_slot);
- // Wait for SOBS to be unset
- wait_for_ctrl_irq (ctrl);
+ set_SOGO(ctrl);
- // Change bits in slot power register to force another shift out
- // NOTE: this is to work around the timer bug
- temp_byte = readb(ctrl->hpc_reg + SLOT_POWER);
- writeb(0x00, ctrl->hpc_reg + SLOT_POWER);
- writeb(temp_byte, ctrl->hpc_reg + SLOT_POWER);
+ // Wait for SOBS to be unset
+ wait_for_ctrl_irq (ctrl);
- set_SOGO(ctrl);
+ // Change bits in slot power register to force another shift out
+ // NOTE: this is to work around the timer bug
+ temp_byte = readb(ctrl->hpc_reg + SLOT_POWER);
+ writeb(0x00, ctrl->hpc_reg + SLOT_POWER);
+ writeb(temp_byte, ctrl->hpc_reg + SLOT_POWER);
- // Wait for SOBS to be unset
- wait_for_ctrl_irq (ctrl);
+ set_SOGO(ctrl);
- if (!(readl(ctrl->hpc_reg + NON_INT_INPUT) & (0x01 << hp_slot))) {
+ // Wait for SOBS to be unset
+ wait_for_ctrl_irq (ctrl);
+
+ // 66MHz and/or PCI-X support check
+ adapter_speed = get_adapter_speed(ctrl, hp_slot);
+ if (ctrl->speed != adapter_speed)
+ if (set_controller_speed(ctrl, adapter_speed, hp_slot))
rc = WRONG_BUS_FREQUENCY;
- }
- // turn off board without attaching to the bus
- disable_slot_power (ctrl, hp_slot);
+
+ // turn off board without attaching to the bus
+ disable_slot_power (ctrl, hp_slot);
- set_SOGO(ctrl);
+ set_SOGO(ctrl);
- // Wait for SOBS to be unset
- wait_for_ctrl_irq (ctrl);
+ // Wait for SOBS to be unset
+ wait_for_ctrl_irq (ctrl);
- // Done with exclusive hardware access
- up(&ctrl->crit_sect);
+ // Done with exclusive hardware access
+ up(&ctrl->crit_sect);
- if (rc)
- return(rc);
- }
- p_slot = find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
+ if (rc)
+ return(rc);
+
+ p_slot = cpqhp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
// turn on board and blink green LED
@@ -1800,7 +1815,7 @@
func = cpqhp_slot_find(ctrl->bus, (hp_slot + ctrl->slot_device_offset), 0);
- p_slot = find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
+ p_slot = cpqhp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
dbg("hp_slot %d, func %p, p_slot %p\n",
hp_slot, func, p_slot);
@@ -1990,7 +2005,7 @@
device = func->device;
hp_slot = device - ctrl->slot_device_offset;
- p_slot = find_slot(ctrl, device);
+ p_slot = cpqhp_find_slot(ctrl, device);
if (p_slot) {
physical_slot = p_slot->number;
}
@@ -2087,7 +2102,7 @@
device = func->device;
func = cpqhp_slot_find(ctrl->bus, device, index++);
- p_slot = find_slot(ctrl, device);
+ p_slot = cpqhp_find_slot(ctrl, device);
if (p_slot) {
physical_slot = p_slot->number;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)