📄 shpchp_hpc.c
字号:
*status = ((slot_status & 0x0100) == 0) ? 0 : 1; /* 0 -> close; 1 -> open */ DBG_LEAVE_ROUTINE return 0;}static int hpc_get_adapter_status(struct slot *slot, u8 *status){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; u16 slot_status; u8 card_state; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); slot_status = (u16)slot_reg; card_state = (u8)((slot_status & 0x0C00) >> 10); *status = (card_state != 0x3) ? 1 : 0; DBG_LEAVE_ROUTINE return 0;}static int hpc_get_prog_int(struct slot *slot, u8 *prog_int){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } *prog_int = readb(php_ctlr->creg + PROG_INTERFACE); DBG_LEAVE_ROUTINE return 0;}static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value){ int retval = 0; struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg = readl(php_ctlr->creg + SLOT1 + 4 * slot->hp_slot); u8 pcix_cap = (slot_reg >> 12) & 7; u8 m66_cap = (slot_reg >> 9) & 1; DBG_ENTER_ROUTINE dbg("%s: slot_reg = %x, pcix_cap = %x, m66_cap = %x\n", __FUNCTION__, slot_reg, pcix_cap, m66_cap); switch (pcix_cap) { case 0x0: *value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz; break; case 0x1: *value = PCI_SPEED_66MHz_PCIX; break; case 0x3: *value = PCI_SPEED_133MHz_PCIX; break; case 0x4: *value = PCI_SPEED_133MHz_PCIX_266; break; case 0x5: *value = PCI_SPEED_133MHz_PCIX_533; break; case 0x2: default: *value = PCI_SPEED_UNKNOWN; retval = -ENODEV; break; } dbg("Adapter speed = %d\n", *value); DBG_LEAVE_ROUTINE return retval;}static int hpc_get_mode1_ECC_cap(struct slot *slot, u8 *mode){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u16 sec_bus_status; u8 pi; int retval = 0; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } pi = readb(php_ctlr->creg + PROG_INTERFACE); sec_bus_status = readw(php_ctlr->creg + SEC_BUS_CONFIG); if (pi == 2) { *mode = (sec_bus_status & 0x0100) >> 8; } else { retval = -1; } dbg("Mode 1 ECC cap = %d\n", *mode); DBG_LEAVE_ROUTINE return retval;}static int hpc_query_power_fault(struct slot * slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u32 slot_reg; u16 slot_status; u8 pwr_fault_state, status; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } slot_reg = readl(php_ctlr->creg + SLOT1 + 4*(slot->hp_slot)); slot_status = (u16) slot_reg; pwr_fault_state = (slot_status & 0x0040) >> 7; status = (pwr_fault_state == 1) ? 0 : 1; DBG_LEAVE_ROUTINE /* Note: Logic 0 => fault */ return status;}static int hpc_set_attention_status(struct slot *slot, u8 value){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd = 0; int rc = 0; if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return -1; } switch (value) { case 0 : slot_cmd = 0x30; /* OFF */ break; case 1: slot_cmd = 0x10; /* ON */ break; case 2: slot_cmd = 0x20; /* BLINK */ break; default: return -1; } shpc_write_cmd(slot, slot->hp_slot, slot_cmd); return rc;}static void hpc_set_green_led_on(struct slot *slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd; if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return ; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return ; } slot_cmd = 0x04; shpc_write_cmd(slot, slot->hp_slot, slot_cmd); return;}static void hpc_set_green_led_off(struct slot *slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd; if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return ; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return ; } slot_cmd = 0x0C; shpc_write_cmd(slot, slot->hp_slot, slot_cmd); return;}static void hpc_set_green_led_blink(struct slot *slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd; if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return ; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return ; } slot_cmd = 0x08; shpc_write_cmd(slot, slot->hp_slot, slot_cmd); return;}int shpc_get_ctlr_slot_config(struct controller *ctrl, int *num_ctlr_slots, /* number of slots in this HPC */ int *first_device_num, /* PCI dev num of the first slot in this SHPC */ int *physical_slot_num, /* phy slot num of the first slot in this SHPC */ int *updown, /* physical_slot_num increament: 1 or -1 */ int *flags){ struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; DBG_ENTER_ROUTINE if (!ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } *first_device_num = php_ctlr->slot_device_offset; /* Obtained in shpc_init() */ *num_ctlr_slots = php_ctlr->num_slots; /* Obtained in shpc_init() */ *physical_slot_num = (readl(php_ctlr->creg + SLOT_CONFIG) & PSN) >> 16; dbg("%s: physical_slot_num = %x\n", __FUNCTION__, *physical_slot_num); *updown = ((readl(php_ctlr->creg + SLOT_CONFIG) & UPDOWN ) >> 29) ? 1 : -1; DBG_LEAVE_ROUTINE return 0;}static void hpc_release_ctlr(struct controller *ctrl){ struct php_ctlr_state_s *php_ctlr = ctrl->hpc_ctlr_handle; struct php_ctlr_state_s *p, *p_prev; int i; DBG_ENTER_ROUTINE if (!ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return ; } /* * Mask all slot event interrupts */ for (i = 0; i < ctrl->num_slots; i++) writel(0xffff3fff, php_ctlr->creg + SLOT1 + (4 * i)); cleanup_slots(ctrl); if (shpchp_poll_mode) { del_timer(&php_ctlr->int_poll_timer); } else { if (php_ctlr->irq) { free_irq(php_ctlr->irq, ctrl); php_ctlr->irq = 0; pci_disable_msi(php_ctlr->pci_dev); } } if (php_ctlr->pci_dev) { iounmap(php_ctlr->creg); release_mem_region(ctrl->mmio_base, ctrl->mmio_size); php_ctlr->pci_dev = NULL; } spin_lock(&list_lock); p = php_ctlr_list_head; p_prev = NULL; while (p) { if (p == php_ctlr) { if (p_prev) p_prev->pnext = p->pnext; else php_ctlr_list_head = p->pnext; break; } else { p_prev = p; p = p->pnext; } } spin_unlock(&list_lock); kfree(php_ctlr);DBG_LEAVE_ROUTINE }static int hpc_power_on_slot(struct slot * slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd; int retval = 0; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return -1; } slot_cmd = 0x01; retval = shpc_write_cmd(slot, slot->hp_slot, slot_cmd); if (retval) { err("%s: Write command failed!\n", __FUNCTION__); return -1; } DBG_LEAVE_ROUTINE return retval;}static int hpc_slot_enable(struct slot * slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd; int retval = 0; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return -1; } /* 3A => Slot - Enable, Power Indicator - Blink, Attention Indicator - Off */ slot_cmd = 0x3A; retval = shpc_write_cmd(slot, slot->hp_slot, slot_cmd); if (retval) { err("%s: Write command failed!\n", __FUNCTION__); return -1; } DBG_LEAVE_ROUTINE return retval;}static int hpc_slot_disable(struct slot * slot){ struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 slot_cmd; int retval = 0; DBG_ENTER_ROUTINE if (!slot->ctrl->hpc_ctlr_handle) { err("%s: Invalid HPC controller handle!\n", __FUNCTION__); return -1; } if (slot->hp_slot >= php_ctlr->num_slots) { err("%s: Invalid HPC slot number!\n", __FUNCTION__); return -1; } /* 1F => Slot - Disable, Power Indicator - Off, Attention Indicator - On */ slot_cmd = 0x1F; retval = shpc_write_cmd(slot, slot->hp_slot, slot_cmd); if (retval) { err("%s: Write command failed!\n", __FUNCTION__); return -1; } DBG_LEAVE_ROUTINE return retval;}static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value){ int retval; struct php_ctlr_state_s *php_ctlr = slot->ctrl->hpc_ctlr_handle; u8 pi, cmd; DBG_ENTER_ROUTINE pi = readb(php_ctlr->creg + PROG_INTERFACE); if ((pi == 1) && (value > PCI_SPEED_133MHz_PCIX)) return -EINVAL; switch (value) { case PCI_SPEED_33MHz: cmd = SETA_PCI_33MHZ; break; case PCI_SPEED_66MHz: cmd = SETA_PCI_66MHZ; break; case PCI_SPEED_66MHz_PCIX: cmd = SETA_PCIX_66MHZ; break; case PCI_SPEED_100MHz_PCIX: cmd = SETA_PCIX_100MHZ; break; case PCI_SPEED_133MHz_PCIX: cmd = SETA_PCIX_133MHZ; break; case PCI_SPEED_66MHz_PCIX_ECC: cmd = SETB_PCIX_66MHZ_EM; break; case PCI_SPEED_100MHz_PCIX_ECC: cmd = SETB_PCIX_100MHZ_EM; break; case PCI_SPEED_133MHz_PCIX_ECC: cmd = SETB_PCIX_133MHZ_EM; break; case PCI_SPEED_66MHz_PCIX_266: cmd = SETB_PCIX_66MHZ_266; break; case PCI_SPEED_100MHz_PCIX_266: cmd = SETB_PCIX_100MHZ_266; break; case PCI_SPEED_133MHz_PCIX_266: cmd = SETB_PCIX_133MHZ_266; break; case PCI_SPEED_66MHz_PCIX_533: cmd = SETB_PCIX_66MHZ_533; break; case PCI_SPEED_100MHz_PCIX_533: cmd = SETB_PCIX_100MHZ_533; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -