2 * PCI Express PCI Hot Plug Driver
4 * Copyright (C) 1995,2001 Compaq Computer Corporation
5 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
6 * Copyright (C) 2001 IBM Corp.
7 * Copyright (C) 2003-2004 Intel Corporation
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or (at
14 * your option) any later version.
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
19 * NON INFRINGEMENT. See the GNU General Public License for more
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * Send feedback to <greg@kroah.com>,<kristen.c.accardi@intel.com>
30 #include <linux/kernel.h>
31 #include <linux/module.h>
32 #include <linux/types.h>
33 #include <linux/signal.h>
34 #include <linux/jiffies.h>
35 #include <linux/timer.h>
36 #include <linux/pci.h>
37 #include <linux/interrupt.h>
42 #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */
43 #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */
44 #define DBG_K_INFO ((unsigned int)0x00000004) /* Info messages */
45 #define DBG_K_ERROR ((unsigned int)0x00000008) /* Error messages */
46 #define DBG_K_TRACE (DBG_K_TRACE_ENTRY|DBG_K_TRACE_EXIT)
47 #define DBG_K_STANDARD (DBG_K_INFO|DBG_K_ERROR|DBG_K_TRACE)
48 /* Redefine this flagword to set debug level */
49 #define DEBUG_LEVEL DBG_K_STANDARD
51 #define DEFINE_DBG_BUFFER char __dbg_str_buf[256];
53 #define DBG_PRINT( dbg_flags, args... ) \
55 if ( DEBUG_LEVEL & ( dbg_flags ) ) \
58 len = sprintf( __dbg_str_buf, "%s:%d: %s: ", \
59 __FILE__, __LINE__, __FUNCTION__ ); \
60 sprintf( __dbg_str_buf + len, args ); \
61 printk( KERN_NOTICE "%s\n", __dbg_str_buf ); \
65 #define DBG_ENTER_ROUTINE DBG_PRINT (DBG_K_TRACE_ENTRY, "%s", "[Entry]");
66 #define DBG_LEAVE_ROUTINE DBG_PRINT (DBG_K_TRACE_EXIT, "%s", "[Exit]");
68 #define DEFINE_DBG_BUFFER
69 #define DBG_ENTER_ROUTINE
70 #define DBG_LEAVE_ROUTINE
89 } __attribute__ ((packed
));
91 /* offsets to the controller registers based on the above structure layout */
93 PCIECAPID
= offsetof(struct ctrl_reg
, cap_id
),
94 NXTCAPPTR
= offsetof(struct ctrl_reg
, nxt_ptr
),
95 CAPREG
= offsetof(struct ctrl_reg
, cap_reg
),
96 DEVCAP
= offsetof(struct ctrl_reg
, dev_cap
),
97 DEVCTRL
= offsetof(struct ctrl_reg
, dev_ctrl
),
98 DEVSTATUS
= offsetof(struct ctrl_reg
, dev_status
),
99 LNKCAP
= offsetof(struct ctrl_reg
, lnk_cap
),
100 LNKCTRL
= offsetof(struct ctrl_reg
, lnk_ctrl
),
101 LNKSTATUS
= offsetof(struct ctrl_reg
, lnk_status
),
102 SLOTCAP
= offsetof(struct ctrl_reg
, slot_cap
),
103 SLOTCTRL
= offsetof(struct ctrl_reg
, slot_ctrl
),
104 SLOTSTATUS
= offsetof(struct ctrl_reg
, slot_status
),
105 ROOTCTRL
= offsetof(struct ctrl_reg
, root_ctrl
),
106 ROOTSTATUS
= offsetof(struct ctrl_reg
, root_status
),
108 static int pcie_cap_base
= 0; /* Base of the PCI Express capability item structure */
110 #define PCIE_CAP_ID(cb) ( cb + PCIECAPID )
111 #define NXT_CAP_PTR(cb) ( cb + NXTCAPPTR )
112 #define CAP_REG(cb) ( cb + CAPREG )
113 #define DEV_CAP(cb) ( cb + DEVCAP )
114 #define DEV_CTRL(cb) ( cb + DEVCTRL )
115 #define DEV_STATUS(cb) ( cb + DEVSTATUS )
116 #define LNK_CAP(cb) ( cb + LNKCAP )
117 #define LNK_CTRL(cb) ( cb + LNKCTRL )
118 #define LNK_STATUS(cb) ( cb + LNKSTATUS )
119 #define SLOT_CAP(cb) ( cb + SLOTCAP )
120 #define SLOT_CTRL(cb) ( cb + SLOTCTRL )
121 #define SLOT_STATUS(cb) ( cb + SLOTSTATUS )
122 #define ROOT_CTRL(cb) ( cb + ROOTCTRL )
123 #define ROOT_STATUS(cb) ( cb + ROOTSTATUS )
125 #define hp_register_read_word(pdev, reg , value) \
126 pci_read_config_word(pdev, reg, &value)
128 #define hp_register_read_dword(pdev, reg , value) \
129 pci_read_config_dword(pdev, reg, &value)
131 #define hp_register_write_word(pdev, reg , value) \
132 pci_write_config_word(pdev, reg, value)
134 #define hp_register_dwrite_word(pdev, reg , value) \
135 pci_write_config_dword(pdev, reg, value)
137 /* Field definitions in PCI Express Capabilities Register */
138 #define CAP_VER 0x000F
139 #define DEV_PORT_TYPE 0x00F0
140 #define SLOT_IMPL 0x0100
141 #define MSG_NUM 0x3E00
143 /* Device or Port Type */
144 #define NAT_ENDPT 0x00
145 #define LEG_ENDPT 0x01
146 #define ROOT_PORT 0x04
147 #define UP_STREAM 0x05
148 #define DN_STREAM 0x06
149 #define PCIE_PCI_BRDG 0x07
150 #define PCI_PCIE_BRDG 0x10
152 /* Field definitions in Device Capabilities Register */
153 #define DATTN_BUTTN_PRSN 0x1000
154 #define DATTN_LED_PRSN 0x2000
155 #define DPWR_LED_PRSN 0x4000
157 /* Field definitions in Link Capabilities Register */
158 #define MAX_LNK_SPEED 0x000F
159 #define MAX_LNK_WIDTH 0x03F0
161 /* Link Width Encoding */
170 /*Field definitions of Link Status Register */
171 #define LNK_SPEED 0x000F
172 #define NEG_LINK_WD 0x03F0
173 #define LNK_TRN_ERR 0x0400
174 #define LNK_TRN 0x0800
175 #define SLOT_CLK_CONF 0x1000
177 /* Field definitions in Slot Capabilities Register */
178 #define ATTN_BUTTN_PRSN 0x00000001
179 #define PWR_CTRL_PRSN 0x00000002
180 #define MRL_SENS_PRSN 0x00000004
181 #define ATTN_LED_PRSN 0x00000008
182 #define PWR_LED_PRSN 0x00000010
183 #define HP_SUPR_RM_SUP 0x00000020
184 #define HP_CAP 0x00000040
185 #define SLOT_PWR_VALUE 0x000003F8
186 #define SLOT_PWR_LIMIT 0x00000C00
187 #define PSN 0xFFF80000 /* PSN: Physical Slot Number */
189 /* Field definitions in Slot Control Register */
190 #define ATTN_BUTTN_ENABLE 0x0001
191 #define PWR_FAULT_DETECT_ENABLE 0x0002
192 #define MRL_DETECT_ENABLE 0x0004
193 #define PRSN_DETECT_ENABLE 0x0008
194 #define CMD_CMPL_INTR_ENABLE 0x0010
195 #define HP_INTR_ENABLE 0x0020
196 #define ATTN_LED_CTRL 0x00C0
197 #define PWR_LED_CTRL 0x0300
198 #define PWR_CTRL 0x0400
200 /* Attention indicator and Power indicator states */
202 #define LED_BLINK 0x10
205 /* Power Control Command */
207 #define POWER_OFF 0x0400
209 /* Field definitions in Slot Status Register */
210 #define ATTN_BUTTN_PRESSED 0x0001
211 #define PWR_FAULT_DETECTED 0x0002
212 #define MRL_SENS_CHANGED 0x0004
213 #define PRSN_DETECT_CHANGED 0x0008
214 #define CMD_COMPLETED 0x0010
215 #define MRL_STATE 0x0020
216 #define PRSN_STATE 0x0040
218 static spinlock_t hpc_event_lock
;
220 DEFINE_DBG_BUFFER
/* Debug string buffer for entire HPC defined here */
221 static struct php_ctlr_state_s
*php_ctlr_list_head
; /* HPC state linked list */
222 static int ctlr_seq_num
= 0; /* Controller sequence # */
223 static spinlock_t list_lock
;
225 static irqreturn_t
pcie_isr(int IRQ
, void *dev_id
, struct pt_regs
*regs
);
227 static void start_int_poll_timer(struct php_ctlr_state_s
*php_ctlr
, int seconds
);
229 /* This is the interrupt polling timeout function. */
230 static void int_poll_timeout(unsigned long lphp_ctlr
)
232 struct php_ctlr_state_s
*php_ctlr
= (struct php_ctlr_state_s
*)lphp_ctlr
;
237 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
241 /* Poll for interrupt events. regs == NULL => polling */
242 pcie_isr( 0, (void *)php_ctlr
, NULL
);
244 init_timer(&php_ctlr
->int_poll_timer
);
246 if (!pciehp_poll_time
)
247 pciehp_poll_time
= 2; /* reset timer to poll in 2 secs if user doesn't specify at module installation*/
249 start_int_poll_timer(php_ctlr
, pciehp_poll_time
);
254 /* This function starts the interrupt polling timer. */
255 static void start_int_poll_timer(struct php_ctlr_state_s
*php_ctlr
, int seconds
)
258 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
262 if ( ( seconds
<= 0 ) || ( seconds
> 60 ) )
263 seconds
= 2; /* Clamp to sane value */
265 php_ctlr
->int_poll_timer
.function
= &int_poll_timeout
;
266 php_ctlr
->int_poll_timer
.data
= (unsigned long)php_ctlr
; /* Instance data */
267 php_ctlr
->int_poll_timer
.expires
= jiffies
+ seconds
* HZ
;
268 add_timer(&php_ctlr
->int_poll_timer
);
273 static int pcie_write_cmd(struct slot
*slot
, u16 cmd
)
275 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
282 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
286 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(slot
->ctrl
->cap_base
), slot_status
);
288 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
292 if ((slot_status
& CMD_COMPLETED
) == CMD_COMPLETED
) {
293 /* After 1 sec and CMD_COMPLETED still not set, just proceed forward to issue
294 the next command according to spec. Just print out the error message */
295 dbg("%s : CMD_COMPLETED not clear after 1 sec.\n", __FUNCTION__
);
298 retval
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), cmd
| CMD_CMPL_INTR_ENABLE
);
300 err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__
);
308 static int hpc_check_lnk_status(struct controller
*ctrl
)
310 struct php_ctlr_state_s
*php_ctlr
= ctrl
->hpc_ctlr_handle
;
317 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
321 retval
= hp_register_read_word(php_ctlr
->pci_dev
, LNK_STATUS(ctrl
->cap_base
), lnk_status
);
324 err("%s : hp_register_read_word LNK_STATUS failed\n", __FUNCTION__
);
328 dbg("%s: lnk_status = %x\n", __FUNCTION__
, lnk_status
);
329 if ( (lnk_status
& LNK_TRN
) || (lnk_status
& LNK_TRN_ERR
) ||
330 !(lnk_status
& NEG_LINK_WD
)) {
331 err("%s : Link Training Error occurs \n", __FUNCTION__
);
341 static int hpc_get_attention_status(struct slot
*slot
, u8
*status
)
343 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
351 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
355 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
358 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
362 dbg("%s: SLOT_CTRL %x, value read %x\n", __FUNCTION__
,SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
364 atten_led_state
= (slot_ctrl
& ATTN_LED_CTRL
) >> 6;
366 switch (atten_led_state
) {
368 *status
= 0xFF; /* Reserved */
371 *status
= 1; /* On */
374 *status
= 2; /* Blink */
377 *status
= 0; /* Off */
388 static int hpc_get_power_status(struct slot
* slot
, u8
*status
)
390 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
398 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
402 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
405 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
408 dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
410 pwr_state
= (slot_ctrl
& PWR_CTRL
) >> 10;
429 static int hpc_get_latch_status(struct slot
*slot
, u8
*status
)
431 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
438 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
442 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(slot
->ctrl
->cap_base
), slot_status
);
445 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
449 *status
= (((slot_status
& MRL_STATE
) >> 5) == 0) ? 0 : 1;
455 static int hpc_get_adapter_status(struct slot
*slot
, u8
*status
)
457 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
465 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
469 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(slot
->ctrl
->cap_base
), slot_status
);
472 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
475 card_state
= (u8
)((slot_status
& PRSN_STATE
) >> 6);
476 *status
= (card_state
== 1) ? 1 : 0;
482 static int hpc_query_power_fault(struct slot
* slot
)
484 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
492 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
496 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(slot
->ctrl
->cap_base
), slot_status
);
499 err("%s : Cannot check for power fault\n", __FUNCTION__
);
502 pwr_fault
= (u8
)((slot_status
& PWR_FAULT_DETECTED
) >> 1);
508 static int hpc_set_attention_status(struct slot
*slot
, u8 value
)
510 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
518 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
522 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
523 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
526 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
529 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
534 case 0 : /* turn off */
535 slot_cmd
= (slot_ctrl
& ~ATTN_LED_CTRL
) | 0x00C0;
537 case 1: /* turn on */
538 slot_cmd
= (slot_ctrl
& ~ATTN_LED_CTRL
) | 0x0040;
540 case 2: /* turn blink */
541 slot_cmd
= (slot_ctrl
& ~ATTN_LED_CTRL
) | 0x0080;
546 if (!pciehp_poll_mode
)
547 slot_cmd
= slot_cmd
| HP_INTR_ENABLE
;
549 pcie_write_cmd(slot
, slot_cmd
);
550 dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_cmd
);
557 static void hpc_set_green_led_on(struct slot
*slot
)
559 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
567 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
571 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
572 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
576 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
579 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
582 slot_cmd
= (slot_ctrl
& ~PWR_LED_CTRL
) | 0x0100;
583 if (!pciehp_poll_mode
)
584 slot_cmd
= slot_cmd
| HP_INTR_ENABLE
;
586 pcie_write_cmd(slot
, slot_cmd
);
588 dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_cmd
);
593 static void hpc_set_green_led_off(struct slot
*slot
)
595 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
603 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
607 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
608 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
612 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
615 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
619 slot_cmd
= (slot_ctrl
& ~PWR_LED_CTRL
) | 0x0300;
621 if (!pciehp_poll_mode
)
622 slot_cmd
= slot_cmd
| HP_INTR_ENABLE
;
623 pcie_write_cmd(slot
, slot_cmd
);
624 dbg("%s: SLOT_CTRL %x write cmd %x\n", __FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_cmd
);
630 static void hpc_set_green_led_blink(struct slot
*slot
)
632 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
640 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
644 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
645 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
649 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
652 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
656 slot_cmd
= (slot_ctrl
& ~PWR_LED_CTRL
) | 0x0200;
658 if (!pciehp_poll_mode
)
659 slot_cmd
= slot_cmd
| HP_INTR_ENABLE
;
660 pcie_write_cmd(slot
, slot_cmd
);
662 dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_cmd
);
667 int pcie_get_ctlr_slot_config(struct controller
*ctrl
,
668 int *num_ctlr_slots
, /* number of slots in this HPC; only 1 in PCIE */
669 int *first_device_num
, /* PCI dev num of the first slot in this PCIE */
670 int *physical_slot_num
, /* phy slot num of the first slot in this PCIE */
673 struct php_ctlr_state_s
*php_ctlr
= ctrl
->hpc_ctlr_handle
;
680 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
684 *first_device_num
= 0;
687 rc
= hp_register_read_dword(php_ctlr
->pci_dev
, SLOT_CAP(ctrl
->cap_base
), slot_cap
);
690 err("%s : hp_register_read_dword SLOT_CAP failed\n", __FUNCTION__
);
694 *physical_slot_num
= slot_cap
>> 19;
695 dbg("%s: PSN %d \n", __FUNCTION__
, *physical_slot_num
);
697 *ctrlcap
= slot_cap
& 0x0000007f;
703 static void hpc_release_ctlr(struct controller
*ctrl
)
705 struct php_ctlr_state_s
*php_ctlr
= ctrl
->hpc_ctlr_handle
;
706 struct php_ctlr_state_s
*p
, *p_prev
;
711 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
715 if (pciehp_poll_mode
) {
716 del_timer(&php_ctlr
->int_poll_timer
);
719 free_irq(php_ctlr
->irq
, ctrl
);
722 pci_disable_msi(php_ctlr
->pci_dev
);
725 if (php_ctlr
->pci_dev
)
726 php_ctlr
->pci_dev
= NULL
;
728 spin_lock(&list_lock
);
729 p
= php_ctlr_list_head
;
734 p_prev
->pnext
= p
->pnext
;
736 php_ctlr_list_head
= p
->pnext
;
743 spin_unlock(&list_lock
);
751 static int hpc_power_on_slot(struct slot
* slot
)
753 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
755 u16 slot_ctrl
, slot_status
;
762 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
766 dbg("%s: slot->hp_slot %x\n", __FUNCTION__
, slot
->hp_slot
);
767 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
768 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
772 /* Clear sticky power-fault bit from previous power failures */
773 hp_register_read_word(php_ctlr
->pci_dev
,
774 SLOT_STATUS(slot
->ctrl
->cap_base
), slot_status
);
775 slot_status
&= PWR_FAULT_DETECTED
;
777 hp_register_write_word(php_ctlr
->pci_dev
,
778 SLOT_STATUS(slot
->ctrl
->cap_base
), slot_status
);
780 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
783 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
787 slot_cmd
= (slot_ctrl
& ~PWR_CTRL
) | POWER_ON
;
789 /* Enable detection that we turned off at slot power-off time */
790 if (!pciehp_poll_mode
)
791 slot_cmd
= slot_cmd
|
792 PWR_FAULT_DETECT_ENABLE
|
797 retval
= pcie_write_cmd(slot
, slot_cmd
);
800 err("%s: Write %x command failed!\n", __FUNCTION__
, slot_cmd
);
803 dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_cmd
);
810 static int hpc_power_off_slot(struct slot
* slot
)
812 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
821 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
825 dbg("%s: slot->hp_slot %x\n", __FUNCTION__
, slot
->hp_slot
);
827 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
828 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
831 retval
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_ctrl
);
834 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
838 slot_cmd
= (slot_ctrl
& ~PWR_CTRL
) | POWER_OFF
;
841 * If we get MRL or presence detect interrupts now, the isr
842 * will notice the sticky power-fault bit too and issue power
843 * indicator change commands. This will lead to an endless loop
844 * of command completions, since the power-fault bit remains on
845 * till the slot is powered on again.
847 if (!pciehp_poll_mode
)
848 slot_cmd
= (slot_cmd
&
849 ~PWR_FAULT_DETECT_ENABLE
&
851 ~PRSN_DETECT_ENABLE
) | HP_INTR_ENABLE
;
853 retval
= pcie_write_cmd(slot
, slot_cmd
);
856 err("%s: Write command failed!\n", __FUNCTION__
);
859 dbg("%s: SLOT_CTRL %x write cmd %x\n",__FUNCTION__
, SLOT_CTRL(slot
->ctrl
->cap_base
), slot_cmd
);
866 static irqreturn_t
pcie_isr(int IRQ
, void *dev_id
, struct pt_regs
*regs
)
868 struct controller
*ctrl
= NULL
;
869 struct php_ctlr_state_s
*php_ctlr
;
870 u8 schedule_flag
= 0;
871 u16 slot_status
, intr_detect
, intr_loc
;
873 int hp_slot
= 0; /* only 1 slot per PCI Express port */
879 if (!pciehp_poll_mode
) {
881 php_ctlr
= ctrl
->hpc_ctlr_handle
;
884 ctrl
= (struct controller
*)php_ctlr
->callback_instance_id
;
888 dbg("%s: dev_id %p ctlr == NULL\n", __FUNCTION__
, (void*) dev_id
);
893 dbg("%s: php_ctlr == NULL\n", __FUNCTION__
);
897 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
899 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
903 intr_detect
= ( ATTN_BUTTN_PRESSED
| PWR_FAULT_DETECTED
| MRL_SENS_CHANGED
|
904 PRSN_DETECT_CHANGED
| CMD_COMPLETED
);
906 intr_loc
= slot_status
& intr_detect
;
908 /* Check to see if it was our interrupt */
912 dbg("%s: intr_loc %x\n", __FUNCTION__
, intr_loc
);
913 /* Mask Hot-plug Interrupt Enable */
914 if (!pciehp_poll_mode
) {
915 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
917 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
921 dbg("%s: hp_register_read_word SLOT_CTRL with value %x\n", __FUNCTION__
, temp_word
);
922 temp_word
= (temp_word
& ~HP_INTR_ENABLE
& ~CMD_CMPL_INTR_ENABLE
) | 0x00;
924 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
926 err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__
);
930 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
932 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
935 dbg("%s: hp_register_read_word SLOT_STATUS with value %x\n", __FUNCTION__
, slot_status
);
937 /* Clear command complete interrupt caused by this write */
939 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), temp_word
);
941 err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__
);
946 if (intr_loc
& CMD_COMPLETED
) {
948 * Command Complete Interrupt Pending
950 wake_up_interruptible(&ctrl
->queue
);
953 if ((php_ctlr
->switch_change_callback
) && (intr_loc
& MRL_SENS_CHANGED
))
954 schedule_flag
+= php_ctlr
->switch_change_callback(
955 hp_slot
, php_ctlr
->callback_instance_id
);
956 if ((php_ctlr
->attention_button_callback
) && (intr_loc
& ATTN_BUTTN_PRESSED
))
957 schedule_flag
+= php_ctlr
->attention_button_callback(
958 hp_slot
, php_ctlr
->callback_instance_id
);
959 if ((php_ctlr
->presence_change_callback
) && (intr_loc
& PRSN_DETECT_CHANGED
))
960 schedule_flag
+= php_ctlr
->presence_change_callback(
961 hp_slot
, php_ctlr
->callback_instance_id
);
962 if ((php_ctlr
->power_fault_callback
) && (intr_loc
& PWR_FAULT_DETECTED
))
963 schedule_flag
+= php_ctlr
->power_fault_callback(
964 hp_slot
, php_ctlr
->callback_instance_id
);
966 /* Clear all events after serving them */
968 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), temp_word
);
970 err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__
);
973 /* Unmask Hot-plug Interrupt Enable */
974 if (!pciehp_poll_mode
) {
975 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
977 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
981 dbg("%s: Unmask Hot-plug Interrupt Enable\n", __FUNCTION__
);
982 temp_word
= (temp_word
& ~HP_INTR_ENABLE
) | HP_INTR_ENABLE
;
984 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
986 err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__
);
990 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
992 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
996 /* Clear command complete interrupt caused by this write */
998 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), temp_word
);
1000 err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__
);
1003 dbg("%s: hp_register_write_word SLOT_STATUS with value %x\n", __FUNCTION__
, temp_word
);
1009 static int hpc_get_max_lnk_speed (struct slot
*slot
, enum pci_bus_speed
*value
)
1011 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
1012 enum pcie_link_speed lnk_speed
;
1019 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
1023 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
1024 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
1028 retval
= hp_register_read_dword(php_ctlr
->pci_dev
, LNK_CAP(slot
->ctrl
->cap_base
), lnk_cap
);
1031 err("%s : hp_register_read_dword LNK_CAP failed\n", __FUNCTION__
);
1035 switch (lnk_cap
& 0x000F) {
1037 lnk_speed
= PCIE_2PT5GB
;
1040 lnk_speed
= PCIE_LNK_SPEED_UNKNOWN
;
1045 dbg("Max link speed = %d\n", lnk_speed
);
1050 static int hpc_get_max_lnk_width (struct slot
*slot
, enum pcie_link_width
*value
)
1052 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
1053 enum pcie_link_width lnk_wdth
;
1060 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
1064 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
1065 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
1069 retval
= hp_register_read_dword(php_ctlr
->pci_dev
, LNK_CAP(slot
->ctrl
->cap_base
), lnk_cap
);
1072 err("%s : hp_register_read_dword LNK_CAP failed\n", __FUNCTION__
);
1076 switch ((lnk_cap
& 0x03F0) >> 4){
1078 lnk_wdth
= PCIE_LNK_WIDTH_RESRV
;
1081 lnk_wdth
= PCIE_LNK_X1
;
1084 lnk_wdth
= PCIE_LNK_X2
;
1087 lnk_wdth
= PCIE_LNK_X4
;
1090 lnk_wdth
= PCIE_LNK_X8
;
1093 lnk_wdth
= PCIE_LNK_X12
;
1096 lnk_wdth
= PCIE_LNK_X16
;
1099 lnk_wdth
= PCIE_LNK_X32
;
1102 lnk_wdth
= PCIE_LNK_WIDTH_UNKNOWN
;
1107 dbg("Max link width = %d\n", lnk_wdth
);
1112 static int hpc_get_cur_lnk_speed (struct slot
*slot
, enum pci_bus_speed
*value
)
1114 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
1115 enum pcie_link_speed lnk_speed
= PCI_SPEED_UNKNOWN
;
1122 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
1126 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
1127 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
1131 retval
= hp_register_read_word(php_ctlr
->pci_dev
, LNK_STATUS(slot
->ctrl
->cap_base
), lnk_status
);
1134 err("%s : hp_register_read_word LNK_STATUS failed\n", __FUNCTION__
);
1138 switch (lnk_status
& 0x0F) {
1140 lnk_speed
= PCIE_2PT5GB
;
1143 lnk_speed
= PCIE_LNK_SPEED_UNKNOWN
;
1148 dbg("Current link speed = %d\n", lnk_speed
);
1153 static int hpc_get_cur_lnk_width (struct slot
*slot
, enum pcie_link_width
*value
)
1155 struct php_ctlr_state_s
*php_ctlr
= slot
->ctrl
->hpc_ctlr_handle
;
1156 enum pcie_link_width lnk_wdth
= PCIE_LNK_WIDTH_UNKNOWN
;
1163 err("%s: Invalid HPC controller handle!\n", __FUNCTION__
);
1167 if (slot
->hp_slot
>= php_ctlr
->num_slots
) {
1168 err("%s: Invalid HPC slot number!\n", __FUNCTION__
);
1172 retval
= hp_register_read_word(php_ctlr
->pci_dev
, LNK_STATUS(slot
->ctrl
->cap_base
), lnk_status
);
1175 err("%s : hp_register_read_word LNK_STATUS failed\n", __FUNCTION__
);
1179 switch ((lnk_status
& 0x03F0) >> 4){
1181 lnk_wdth
= PCIE_LNK_WIDTH_RESRV
;
1184 lnk_wdth
= PCIE_LNK_X1
;
1187 lnk_wdth
= PCIE_LNK_X2
;
1190 lnk_wdth
= PCIE_LNK_X4
;
1193 lnk_wdth
= PCIE_LNK_X8
;
1196 lnk_wdth
= PCIE_LNK_X12
;
1199 lnk_wdth
= PCIE_LNK_X16
;
1202 lnk_wdth
= PCIE_LNK_X32
;
1205 lnk_wdth
= PCIE_LNK_WIDTH_UNKNOWN
;
1210 dbg("Current link width = %d\n", lnk_wdth
);
1215 static struct hpc_ops pciehp_hpc_ops
= {
1216 .power_on_slot
= hpc_power_on_slot
,
1217 .power_off_slot
= hpc_power_off_slot
,
1218 .set_attention_status
= hpc_set_attention_status
,
1219 .get_power_status
= hpc_get_power_status
,
1220 .get_attention_status
= hpc_get_attention_status
,
1221 .get_latch_status
= hpc_get_latch_status
,
1222 .get_adapter_status
= hpc_get_adapter_status
,
1224 .get_max_bus_speed
= hpc_get_max_lnk_speed
,
1225 .get_cur_bus_speed
= hpc_get_cur_lnk_speed
,
1226 .get_max_lnk_width
= hpc_get_max_lnk_width
,
1227 .get_cur_lnk_width
= hpc_get_cur_lnk_width
,
1229 .query_power_fault
= hpc_query_power_fault
,
1230 .green_led_on
= hpc_set_green_led_on
,
1231 .green_led_off
= hpc_set_green_led_off
,
1232 .green_led_blink
= hpc_set_green_led_blink
,
1234 .release_ctlr
= hpc_release_ctlr
,
1235 .check_lnk_status
= hpc_check_lnk_status
,
1239 int pciehp_acpi_get_hp_hw_control_from_firmware(struct pci_dev
*dev
)
1242 acpi_handle chandle
, handle
= DEVICE_ACPI_HANDLE(&(dev
->dev
));
1243 struct pci_dev
*pdev
= dev
;
1244 struct pci_bus
*parent
;
1245 struct acpi_buffer string
= { ACPI_ALLOCATE_BUFFER
, NULL
};
1248 * Per PCI firmware specification, we should run the ACPI _OSC
1249 * method to get control of hotplug hardware before using it.
1250 * If an _OSC is missing, we look for an OSHP to do the same thing.
1251 * To handle different BIOS behavior, we look for _OSC and OSHP
1252 * within the scope of the hotplug controller and its parents, upto
1253 * the host bridge under which this controller exists.
1257 * This hotplug controller was not listed in the ACPI name
1258 * space at all. Try to get acpi handle of parent pci bus.
1260 if (!pdev
|| !pdev
->bus
->parent
)
1262 parent
= pdev
->bus
->parent
;
1263 dbg("Could not find %s in acpi namespace, trying parent\n",
1266 /* Parent must be a host bridge */
1267 handle
= acpi_get_pci_rootbridge_handle(
1268 pci_domain_nr(parent
),
1271 handle
= DEVICE_ACPI_HANDLE(
1272 &(parent
->self
->dev
));
1273 pdev
= parent
->self
;
1277 acpi_get_name(handle
, ACPI_FULL_PATHNAME
, &string
);
1278 dbg("Trying to get hotplug control for %s \n",
1279 (char *)string
.pointer
);
1280 status
= pci_osc_control_set(handle
,
1281 OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
);
1282 if (status
== AE_NOT_FOUND
)
1283 status
= acpi_run_oshp(handle
);
1284 if (ACPI_SUCCESS(status
)) {
1285 dbg("Gained control for hotplug HW for pci %s (%s)\n",
1286 pci_name(dev
), (char *)string
.pointer
);
1287 kfree(string
.pointer
);
1290 if (acpi_root_bridge(handle
))
1293 status
= acpi_get_parent(chandle
, &handle
);
1294 if (ACPI_FAILURE(status
))
1298 err("Cannot get control of hotplug hardware for pci %s\n",
1301 kfree(string
.pointer
);
1308 int pcie_init(struct controller
* ctrl
, struct pcie_device
*dev
)
1310 struct php_ctlr_state_s
*php_ctlr
, *p
;
1311 void *instance_id
= ctrl
;
1313 static int first
= 1;
1316 u16 intr_enable
= 0;
1318 int cap_base
, saved_cap_base
;
1319 u16 slot_status
, slot_ctrl
;
1320 struct pci_dev
*pdev
;
1324 spin_lock_init(&list_lock
);
1325 php_ctlr
= (struct php_ctlr_state_s
*) kmalloc(sizeof(struct php_ctlr_state_s
), GFP_KERNEL
);
1327 if (!php_ctlr
) { /* allocate controller state data */
1328 err("%s: HPC controller memory allocation error!\n", __FUNCTION__
);
1332 memset(php_ctlr
, 0, sizeof(struct php_ctlr_state_s
));
1335 php_ctlr
->pci_dev
= pdev
; /* save pci_dev in context */
1337 dbg("%s: hotplug controller vendor id 0x%x device id 0x%x\n",
1338 __FUNCTION__
, pdev
->vendor
, pdev
->device
);
1340 saved_cap_base
= pcie_cap_base
;
1342 if ((cap_base
= pci_find_capability(pdev
, PCI_CAP_ID_EXP
)) == 0) {
1343 dbg("%s: Can't find PCI_CAP_ID_EXP (0x10)\n", __FUNCTION__
);
1344 goto abort_free_ctlr
;
1347 ctrl
->cap_base
= cap_base
;
1349 dbg("%s: pcie_cap_base %x\n", __FUNCTION__
, pcie_cap_base
);
1351 rc
= hp_register_read_word(pdev
, CAP_REG(ctrl
->cap_base
), cap_reg
);
1353 err("%s : hp_register_read_word CAP_REG failed\n", __FUNCTION__
);
1354 goto abort_free_ctlr
;
1356 dbg("%s: CAP_REG offset %x cap_reg %x\n", __FUNCTION__
, CAP_REG(ctrl
->cap_base
), cap_reg
);
1358 if (((cap_reg
& SLOT_IMPL
) == 0) || (((cap_reg
& DEV_PORT_TYPE
) != 0x0040)
1359 && ((cap_reg
& DEV_PORT_TYPE
) != 0x0060))) {
1360 dbg("%s : This is not a root port or the port is not connected to a slot\n", __FUNCTION__
);
1361 goto abort_free_ctlr
;
1364 rc
= hp_register_read_dword(php_ctlr
->pci_dev
, SLOT_CAP(ctrl
->cap_base
), slot_cap
);
1366 err("%s : hp_register_read_word CAP_REG failed\n", __FUNCTION__
);
1367 goto abort_free_ctlr
;
1369 dbg("%s: SLOT_CAP offset %x slot_cap %x\n", __FUNCTION__
, SLOT_CAP(ctrl
->cap_base
), slot_cap
);
1371 if (!(slot_cap
& HP_CAP
)) {
1372 dbg("%s : This slot is not hot-plug capable\n", __FUNCTION__
);
1373 goto abort_free_ctlr
;
1375 /* For debugging purpose */
1376 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
1378 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
1379 goto abort_free_ctlr
;
1381 dbg("%s: SLOT_STATUS offset %x slot_status %x\n", __FUNCTION__
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
1383 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_CTRL(ctrl
->cap_base
), slot_ctrl
);
1385 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
1386 goto abort_free_ctlr
;
1388 dbg("%s: SLOT_CTRL offset %x slot_ctrl %x\n", __FUNCTION__
, SLOT_CTRL(ctrl
->cap_base
), slot_ctrl
);
1391 spin_lock_init(&hpc_event_lock
);
1395 for ( rc
= 0; rc
< DEVICE_COUNT_RESOURCE
; rc
++)
1396 if (pci_resource_len(pdev
, rc
) > 0)
1397 dbg("pci resource[%d] start=0x%llx(len=0x%llx)\n", rc
,
1398 (unsigned long long)pci_resource_start(pdev
, rc
),
1399 (unsigned long long)pci_resource_len(pdev
, rc
));
1401 info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n", pdev
->vendor
, pdev
->device
,
1402 pdev
->subsystem_vendor
, pdev
->subsystem_device
);
1404 mutex_init(&ctrl
->crit_sect
);
1405 /* setup wait queue */
1406 init_waitqueue_head(&ctrl
->queue
);
1409 php_ctlr
->irq
= dev
->irq
;
1411 /* Save interrupt callback info */
1412 php_ctlr
->attention_button_callback
= pciehp_handle_attention_button
;
1413 php_ctlr
->switch_change_callback
= pciehp_handle_switch_change
;
1414 php_ctlr
->presence_change_callback
= pciehp_handle_presence_change
;
1415 php_ctlr
->power_fault_callback
= pciehp_handle_power_fault
;
1416 php_ctlr
->callback_instance_id
= instance_id
;
1418 /* return PCI Controller Info */
1419 php_ctlr
->slot_device_offset
= 0;
1420 php_ctlr
->num_slots
= 1;
1422 /* Mask Hot-plug Interrupt Enable */
1423 rc
= hp_register_read_word(pdev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1425 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
1426 goto abort_free_ctlr
;
1429 dbg("%s: SLOT_CTRL %x value read %x\n", __FUNCTION__
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1430 temp_word
= (temp_word
& ~HP_INTR_ENABLE
& ~CMD_CMPL_INTR_ENABLE
) | 0x00;
1432 rc
= hp_register_write_word(pdev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1434 err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__
);
1435 goto abort_free_ctlr
;
1438 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
1440 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
1441 goto abort_free_ctlr
;
1444 temp_word
= 0x1F; /* Clear all events */
1445 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), temp_word
);
1447 err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__
);
1448 goto abort_free_ctlr
;
1451 if (pciehp_poll_mode
) {/* Install interrupt polling code */
1452 /* Install and start the interrupt polling timer */
1453 init_timer(&php_ctlr
->int_poll_timer
);
1454 start_int_poll_timer( php_ctlr
, 10 ); /* start with 10 second delay */
1456 /* Installs the interrupt handler */
1457 rc
= request_irq(php_ctlr
->irq
, pcie_isr
, IRQF_SHARED
, MY_NAME
, (void *) ctrl
);
1458 dbg("%s: request_irq %d for hpc%d (returns %d)\n", __FUNCTION__
, php_ctlr
->irq
, ctlr_seq_num
, rc
);
1460 err("Can't get irq %d for the hotplug controller\n", php_ctlr
->irq
);
1461 goto abort_free_ctlr
;
1465 dbg("pciehp ctrl b:d:f:irq=0x%x:%x:%x:%x\n", pdev
->bus
->number
,
1466 PCI_SLOT(pdev
->devfn
), PCI_FUNC(pdev
->devfn
), dev
->irq
);
1468 rc
= hp_register_read_word(pdev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1470 err("%s : hp_register_read_word SLOT_CTRL failed\n", __FUNCTION__
);
1471 goto abort_free_irq
;
1474 intr_enable
= intr_enable
| PRSN_DETECT_ENABLE
;
1476 if (ATTN_BUTTN(slot_cap
))
1477 intr_enable
= intr_enable
| ATTN_BUTTN_ENABLE
;
1479 if (POWER_CTRL(slot_cap
))
1480 intr_enable
= intr_enable
| PWR_FAULT_DETECT_ENABLE
;
1482 if (MRL_SENS(slot_cap
))
1483 intr_enable
= intr_enable
| MRL_DETECT_ENABLE
;
1485 temp_word
= (temp_word
& ~intr_enable
) | intr_enable
;
1487 if (pciehp_poll_mode
) {
1488 temp_word
= (temp_word
& ~HP_INTR_ENABLE
) | 0x0;
1490 temp_word
= (temp_word
& ~HP_INTR_ENABLE
) | HP_INTR_ENABLE
;
1493 /* Unmask Hot-plug Interrupt Enable for the interrupt notification mechanism case */
1494 rc
= hp_register_write_word(pdev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1496 err("%s : hp_register_write_word SLOT_CTRL failed\n", __FUNCTION__
);
1497 goto abort_free_irq
;
1499 rc
= hp_register_read_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), slot_status
);
1501 err("%s : hp_register_read_word SLOT_STATUS failed\n", __FUNCTION__
);
1502 goto abort_disable_intr
;
1505 temp_word
= 0x1F; /* Clear all events */
1506 rc
= hp_register_write_word(php_ctlr
->pci_dev
, SLOT_STATUS(ctrl
->cap_base
), temp_word
);
1508 err("%s : hp_register_write_word SLOT_STATUS failed\n", __FUNCTION__
);
1509 goto abort_disable_intr
;
1513 dbg("Bypassing BIOS check for pciehp use on %s\n",
1514 pci_name(ctrl
->pci_dev
));
1516 rc
= pciehp_get_hp_hw_control_from_firmware(ctrl
->pci_dev
);
1518 goto abort_disable_intr
;
1521 /* Add this HPC instance into the HPC list */
1522 spin_lock(&list_lock
);
1523 if (php_ctlr_list_head
== 0) {
1524 php_ctlr_list_head
= php_ctlr
;
1525 p
= php_ctlr_list_head
;
1528 p
= php_ctlr_list_head
;
1533 p
->pnext
= php_ctlr
;
1535 spin_unlock(&list_lock
);
1538 ctrl
->hpc_ctlr_handle
= php_ctlr
;
1539 ctrl
->hpc_ops
= &pciehp_hpc_ops
;
1544 /* We end up here for the many possible ways to fail this API. */
1546 rc
= hp_register_read_word(pdev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1548 temp_word
&= ~(intr_enable
| HP_INTR_ENABLE
);
1549 rc
= hp_register_write_word(pdev
, SLOT_CTRL(ctrl
->cap_base
), temp_word
);
1552 err("%s : disabling interrupts failed\n", __FUNCTION__
);
1555 if (pciehp_poll_mode
)
1556 del_timer_sync(&php_ctlr
->int_poll_timer
);
1558 free_irq(php_ctlr
->irq
, ctrl
);
1561 pcie_cap_base
= saved_cap_base
;