pciehp_hpc.c 28.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * PCI Express PCI Hot Plug Driver
 *
 * Copyright (C) 1995,2001 Compaq Computer Corporation
 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
 * Copyright (C) 2001 IBM Corp.
 * Copyright (C) 2003-2004 Intel Corporation
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
26
 * Send feedback to <greg@kroah.com>,<kristen.c.accardi@intel.com>
L
Linus Torvalds 已提交
27 28 29 30 31 32
 *
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
33 34 35
#include <linux/signal.h>
#include <linux/jiffies.h>
#include <linux/timer.h>
L
Linus Torvalds 已提交
36
#include <linux/pci.h>
A
Andrew Morton 已提交
37
#include <linux/interrupt.h>
38
#include <linux/time.h>
A
Andrew Morton 已提交
39

L
Linus Torvalds 已提交
40 41 42
#include "../pci.h"
#include "pciehp.h"

K
Kenji Kaneshige 已提交
43 44
static atomic_t pciehp_num_controllers = ATOMIC_INIT(0);

L
Linus Torvalds 已提交
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
struct ctrl_reg {
	u8 cap_id;
	u8 nxt_ptr;
	u16 cap_reg;
	u32 dev_cap;
	u16 dev_ctrl;
	u16 dev_status;
	u32 lnk_cap;
	u16 lnk_ctrl;
	u16 lnk_status;
	u32 slot_cap;
	u16 slot_ctrl;
	u16 slot_status;
	u16 root_ctrl;
	u16 rsvp;
	u32 root_status;
} __attribute__ ((packed));

/* offsets to the controller registers based on the above structure layout */
enum ctrl_offsets {
	PCIECAPID	=	offsetof(struct ctrl_reg, cap_id),
	NXTCAPPTR	=	offsetof(struct ctrl_reg, nxt_ptr),
	CAPREG		=	offsetof(struct ctrl_reg, cap_reg),
	DEVCAP		=	offsetof(struct ctrl_reg, dev_cap),
	DEVCTRL		=	offsetof(struct ctrl_reg, dev_ctrl),
	DEVSTATUS	=	offsetof(struct ctrl_reg, dev_status),
	LNKCAP		=	offsetof(struct ctrl_reg, lnk_cap),
	LNKCTRL		=	offsetof(struct ctrl_reg, lnk_ctrl),
	LNKSTATUS	=	offsetof(struct ctrl_reg, lnk_status),
	SLOTCAP		=	offsetof(struct ctrl_reg, slot_cap),
	SLOTCTRL	=	offsetof(struct ctrl_reg, slot_ctrl),
	SLOTSTATUS	=	offsetof(struct ctrl_reg, slot_status),
	ROOTCTRL	=	offsetof(struct ctrl_reg, root_ctrl),
	ROOTSTATUS	=	offsetof(struct ctrl_reg, root_status),
};

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
static inline int pciehp_readw(struct controller *ctrl, int reg, u16 *value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_read_config_word(dev, ctrl->cap_base + reg, value);
}

static inline int pciehp_readl(struct controller *ctrl, int reg, u32 *value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_read_config_dword(dev, ctrl->cap_base + reg, value);
}

static inline int pciehp_writew(struct controller *ctrl, int reg, u16 value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_write_config_word(dev, ctrl->cap_base + reg, value);
}

static inline int pciehp_writel(struct controller *ctrl, int reg, u32 value)
{
	struct pci_dev *dev = ctrl->pci_dev;
	return pci_write_config_dword(dev, ctrl->cap_base + reg, value);
}
L
Linus Torvalds 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

/* Field definitions in PCI Express Capabilities Register */
#define CAP_VER			0x000F
#define DEV_PORT_TYPE		0x00F0
#define SLOT_IMPL		0x0100
#define MSG_NUM			0x3E00

/* Device or Port Type */
#define NAT_ENDPT		0x00
#define LEG_ENDPT		0x01
#define ROOT_PORT		0x04
#define UP_STREAM		0x05
#define	DN_STREAM		0x06
#define PCIE_PCI_BRDG		0x07
#define PCI_PCIE_BRDG		0x10

/* Field definitions in Device Capabilities Register */
#define DATTN_BUTTN_PRSN	0x1000
#define DATTN_LED_PRSN		0x2000
#define DPWR_LED_PRSN		0x4000

/* Field definitions in Link Capabilities Register */
#define MAX_LNK_SPEED		0x000F
#define MAX_LNK_WIDTH		0x03F0

/* Link Width Encoding */
#define LNK_X1		0x01
#define LNK_X2		0x02
132
#define LNK_X4		0x04
L
Linus Torvalds 已提交
133 134
#define LNK_X8		0x08
#define LNK_X12		0x0C
135
#define LNK_X16		0x10
L
Linus Torvalds 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
#define LNK_X32		0x20

/*Field definitions of Link Status Register */
#define LNK_SPEED	0x000F
#define NEG_LINK_WD	0x03F0
#define LNK_TRN_ERR	0x0400
#define	LNK_TRN		0x0800
#define SLOT_CLK_CONF	0x1000

/* Field definitions in Slot Capabilities Register */
#define ATTN_BUTTN_PRSN	0x00000001
#define	PWR_CTRL_PRSN	0x00000002
#define MRL_SENS_PRSN	0x00000004
#define ATTN_LED_PRSN	0x00000008
#define PWR_LED_PRSN	0x00000010
#define HP_SUPR_RM_SUP	0x00000020
#define HP_CAP		0x00000040
#define SLOT_PWR_VALUE	0x000003F8
#define SLOT_PWR_LIMIT	0x00000C00
#define PSN		0xFFF80000	/* PSN: Physical Slot Number */

/* Field definitions in Slot Control Register */
#define ATTN_BUTTN_ENABLE		0x0001
#define PWR_FAULT_DETECT_ENABLE		0x0002
#define MRL_DETECT_ENABLE		0x0004
#define PRSN_DETECT_ENABLE		0x0008
#define CMD_CMPL_INTR_ENABLE		0x0010
#define HP_INTR_ENABLE			0x0020
#define ATTN_LED_CTRL			0x00C0
#define PWR_LED_CTRL			0x0300
#define PWR_CTRL			0x0400
167
#define EMI_CTRL			0x0800
L
Linus Torvalds 已提交
168 169 170 171 172 173 174 175 176 177

/* Attention indicator and Power indicator states */
#define LED_ON		0x01
#define LED_BLINK	0x10
#define LED_OFF		0x11

/* Power Control Command */
#define POWER_ON	0
#define POWER_OFF	0x0400

178 179 180 181
/* EMI Status defines */
#define EMI_DISENGAGED	0
#define EMI_ENGAGED	1

L
Linus Torvalds 已提交
182 183 184 185 186 187 188 189
/* Field definitions in Slot Status Register */
#define ATTN_BUTTN_PRESSED	0x0001
#define PWR_FAULT_DETECTED	0x0002
#define MRL_SENS_CHANGED	0x0004
#define PRSN_DETECT_CHANGED	0x0008
#define CMD_COMPLETED		0x0010
#define MRL_STATE		0x0020
#define PRSN_STATE		0x0040
190 191
#define EMI_STATE		0x0080
#define EMI_STATUS_BIT		7
L
Linus Torvalds 已提交
192

193 194
static irqreturn_t pcie_isr(int irq, void *dev_id);
static void start_int_poll_timer(struct controller *ctrl, int sec);
L
Linus Torvalds 已提交
195 196

/* This is the interrupt polling timeout function. */
197
static void int_poll_timeout(unsigned long data)
L
Linus Torvalds 已提交
198
{
199
	struct controller *ctrl = (struct controller *)data;
L
Linus Torvalds 已提交
200 201

	/* Poll for interrupt events.  regs == NULL => polling */
202
	pcie_isr(0, ctrl);
L
Linus Torvalds 已提交
203

204
	init_timer(&ctrl->poll_timer);
L
Linus Torvalds 已提交
205
	if (!pciehp_poll_time)
206
		pciehp_poll_time = 2; /* default polling interval is 2 sec */
L
Linus Torvalds 已提交
207

208
	start_int_poll_timer(ctrl, pciehp_poll_time);
L
Linus Torvalds 已提交
209 210 211
}

/* This function starts the interrupt polling timer. */
212
static void start_int_poll_timer(struct controller *ctrl, int sec)
L
Linus Torvalds 已提交
213
{
214 215 216 217 218 219 220 221
	/* Clamp to sane value */
	if ((sec <= 0) || (sec > 60))
        	sec = 2;

	ctrl->poll_timer.function = &int_poll_timeout;
	ctrl->poll_timer.data = (unsigned long)ctrl;
	ctrl->poll_timer.expires = jiffies + sec * HZ;
	add_timer(&ctrl->poll_timer);
L
Linus Torvalds 已提交
222 223
}

K
Kenji Kaneshige 已提交
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
static inline int pciehp_request_irq(struct controller *ctrl)
{
	int retval, irq = ctrl->pci_dev->irq;

	/* Install interrupt polling timer. Start with 10 sec delay */
	if (pciehp_poll_mode) {
		init_timer(&ctrl->poll_timer);
		start_int_poll_timer(ctrl, 10);
		return 0;
	}

	/* Installs the interrupt handler */
	retval = request_irq(irq, pcie_isr, IRQF_SHARED, MY_NAME, ctrl);
	if (retval)
		err("Cannot get irq %d for the hotplug controller\n", irq);
	return retval;
}

static inline void pciehp_free_irq(struct controller *ctrl)
{
	if (pciehp_poll_mode)
		del_timer_sync(&ctrl->poll_timer);
	else
		free_irq(ctrl->pci_dev->irq, ctrl);
}

250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
static inline int pcie_poll_cmd(struct controller *ctrl)
{
	u16 slot_status;
	int timeout = 1000;

	if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status))
		if (slot_status & CMD_COMPLETED)
			goto completed;
	for (timeout = 1000; timeout > 0; timeout -= 100) {
		msleep(100);
		if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status))
			if (slot_status & CMD_COMPLETED)
				goto completed;
	}
	return 0;	/* timeout */

completed:
	pciehp_writew(ctrl, SLOTSTATUS, CMD_COMPLETED);
	return timeout;
}

271
static inline void pcie_wait_cmd(struct controller *ctrl, int poll)
272
{
273 274 275 276
	unsigned int msecs = pciehp_poll_mode ? 2500 : 1000;
	unsigned long timeout = msecs_to_jiffies(msecs);
	int rc;

277 278 279
	if (poll)
		rc = pcie_poll_cmd(ctrl);
	else
280
		rc = wait_event_timeout(ctrl->queue, !ctrl->cmd_busy, timeout);
281 282
	if (!rc)
		dbg("Command not completed in 1000 msec\n");
283 284
}

285 286
/**
 * pcie_write_cmd - Issue controller command
287
 * @ctrl: controller to which the command is issued
288 289 290
 * @cmd:  command value written to slot control register
 * @mask: bitmask of slot control register to be modified
 */
291
static int pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask)
L
Linus Torvalds 已提交
292 293 294
{
	int retval = 0;
	u16 slot_status;
295
	u16 slot_ctrl;
L
Linus Torvalds 已提交
296

297 298
	mutex_lock(&ctrl->ctrl_lock);

299
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
300
	if (retval) {
301
		err("%s: Cannot read SLOTSTATUS register\n", __func__);
302
		goto out;
303 304
	}

K
Kenji Kaneshige 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
	if (slot_status & CMD_COMPLETED) {
		if (!ctrl->no_cmd_complete) {
			/*
			 * After 1 sec and CMD_COMPLETED still not set, just
			 * proceed forward to issue the next command according
			 * to spec. Just print out the error message.
			 */
			dbg("%s: CMD_COMPLETED not clear after 1 sec.\n",
			    __func__);
		} else if (!NO_CMD_CMPL(ctrl)) {
			/*
			 * This controller semms to notify of command completed
			 * event even though it supports none of power
			 * controller, attention led, power led and EMI.
			 */
			dbg("%s: Unexpected CMD_COMPLETED. Need to wait for "
			    "command completed event.\n", __func__);
			ctrl->no_cmd_complete = 0;
		} else {
			dbg("%s: Unexpected CMD_COMPLETED. Maybe the "
			    "controller is broken.\n", __func__);
		}
L
Linus Torvalds 已提交
327 328
	}

329
	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
L
Linus Torvalds 已提交
330
	if (retval) {
331
		err("%s: Cannot read SLOTCTRL register\n", __func__);
332
		goto out;
L
Linus Torvalds 已提交
333 334
	}

335
	slot_ctrl &= ~mask;
K
Kenji Kaneshige 已提交
336 337 338 339
	slot_ctrl |= (cmd & mask);
	/* Don't enable command completed if caller is changing it. */
	if (!(mask & CMD_CMPL_INTR_ENABLE))
		slot_ctrl |= CMD_CMPL_INTR_ENABLE;
340 341

	ctrl->cmd_busy = 1;
342
	smp_mb();
343 344
	retval = pciehp_writew(ctrl, SLOTCTRL, slot_ctrl);
	if (retval)
345
		err("%s: Cannot write to SLOTCTRL register\n", __func__);
346

347 348 349
	/*
	 * Wait for command completion.
	 */
350 351 352 353 354 355 356 357 358 359
	if (!retval && !ctrl->no_cmd_complete) {
		int poll = 0;
		/*
		 * if hotplug interrupt is not enabled or command
		 * completed interrupt is not enabled, we need to poll
		 * command completed event.
		 */
		if (!(slot_ctrl & HP_INTR_ENABLE) ||
		    !(slot_ctrl & CMD_CMPL_INTR_ENABLE))
			poll = 1;
360
                pcie_wait_cmd(ctrl, poll);
361
	}
362 363
 out:
	mutex_unlock(&ctrl->ctrl_lock);
L
Linus Torvalds 已提交
364 365 366 367 368 369 370 371
	return retval;
}

static int hpc_check_lnk_status(struct controller *ctrl)
{
	u16 lnk_status;
	int retval = 0;

372
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
373
	if (retval) {
374
		err("%s: Cannot read LNKSTATUS register\n", __func__);
L
Linus Torvalds 已提交
375 376 377
		return retval;
	}

378
	dbg("%s: lnk_status = %x\n", __func__, lnk_status);
379
	if ( (lnk_status & LNK_TRN) || (lnk_status & LNK_TRN_ERR) ||
L
Linus Torvalds 已提交
380
		!(lnk_status & NEG_LINK_WD)) {
381
		err("%s : Link Training Error occurs \n", __func__);
L
Linus Torvalds 已提交
382 383 384 385 386 387 388 389 390
		retval = -1;
		return retval;
	}

	return retval;
}

static int hpc_get_attention_status(struct slot *slot, u8 *status)
{
391
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
392 393 394 395
	u16 slot_ctrl;
	u8 atten_led_state;
	int retval = 0;

396
	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
L
Linus Torvalds 已提交
397
	if (retval) {
398
		err("%s: Cannot read SLOTCTRL register\n", __func__);
L
Linus Torvalds 已提交
399 400 401
		return retval;
	}

402
	dbg("%s: SLOTCTRL %x, value read %x\n",
403
	    __func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
L
Linus Torvalds 已提交
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427

	atten_led_state = (slot_ctrl & ATTN_LED_CTRL) >> 6;

	switch (atten_led_state) {
	case 0:
		*status = 0xFF;	/* Reserved */
		break;
	case 1:
		*status = 1;	/* On */
		break;
	case 2:
		*status = 2;	/* Blink */
		break;
	case 3:
		*status = 0;	/* Off */
		break;
	default:
		*status = 0xFF;
		break;
	}

	return 0;
}

428
static int hpc_get_power_status(struct slot *slot, u8 *status)
L
Linus Torvalds 已提交
429
{
430
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
431 432 433 434
	u16 slot_ctrl;
	u8 pwr_state;
	int	retval = 0;

435
	retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
L
Linus Torvalds 已提交
436
	if (retval) {
437
		err("%s: Cannot read SLOTCTRL register\n", __func__);
L
Linus Torvalds 已提交
438 439
		return retval;
	}
440
	dbg("%s: SLOTCTRL %x value read %x\n",
441
	    __func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
L
Linus Torvalds 已提交
442 443 444 445 446 447 448 449

	pwr_state = (slot_ctrl & PWR_CTRL) >> 10;

	switch (pwr_state) {
	case 0:
		*status = 1;
		break;
	case 1:
450
		*status = 0;
L
Linus Torvalds 已提交
451 452 453 454 455 456 457 458 459 460 461
		break;
	default:
		*status = 0xFF;
		break;
	}

	return retval;
}

static int hpc_get_latch_status(struct slot *slot, u8 *status)
{
462
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
463 464 465
	u16 slot_status;
	int retval = 0;

466
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
467
	if (retval) {
468
		err("%s: Cannot read SLOTSTATUS register\n", __func__);
L
Linus Torvalds 已提交
469 470 471
		return retval;
	}

472
	*status = (((slot_status & MRL_STATE) >> 5) == 0) ? 0 : 1;
L
Linus Torvalds 已提交
473 474 475 476 477 478

	return 0;
}

static int hpc_get_adapter_status(struct slot *slot, u8 *status)
{
479
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
480 481 482 483
	u16 slot_status;
	u8 card_state;
	int retval = 0;

484
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
485
	if (retval) {
486
		err("%s: Cannot read SLOTSTATUS register\n", __func__);
L
Linus Torvalds 已提交
487 488 489 490 491 492 493 494
		return retval;
	}
	card_state = (u8)((slot_status & PRSN_STATE) >> 6);
	*status = (card_state == 1) ? 1 : 0;

	return 0;
}

495
static int hpc_query_power_fault(struct slot *slot)
L
Linus Torvalds 已提交
496
{
497
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
498 499 500 501
	u16 slot_status;
	u8 pwr_fault;
	int retval = 0;

502
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
L
Linus Torvalds 已提交
503
	if (retval) {
504
		err("%s: Cannot check for power fault\n", __func__);
L
Linus Torvalds 已提交
505 506 507
		return retval;
	}
	pwr_fault = (u8)((slot_status & PWR_FAULT_DETECTED) >> 1);
508

509
	return pwr_fault;
L
Linus Torvalds 已提交
510 511
}

512 513 514 515 516 517 518 519
static int hpc_get_emi_status(struct slot *slot, u8 *status)
{
	struct controller *ctrl = slot->ctrl;
	u16 slot_status;
	int retval = 0;

	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
	if (retval) {
520
		err("%s : Cannot check EMI status\n", __func__);
521 522 523 524 525 526 527 528 529
		return retval;
	}
	*status = (slot_status & EMI_STATE) >> EMI_STATUS_BIT;

	return retval;
}

static int hpc_toggle_emi(struct slot *slot)
{
530 531 532
	u16 slot_cmd;
	u16 cmd_mask;
	int rc;
533

534 535
	slot_cmd = EMI_CTRL;
	cmd_mask = EMI_CTRL;
536
	rc = pcie_write_cmd(slot->ctrl, slot_cmd, cmd_mask);
537
	slot->last_emi_toggle = get_seconds();
K
Kenji Kaneshige 已提交
538

539 540 541
	return rc;
}

L
Linus Torvalds 已提交
542 543
static int hpc_set_attention_status(struct slot *slot, u8 value)
{
544
	struct controller *ctrl = slot->ctrl;
545 546 547
	u16 slot_cmd;
	u16 cmd_mask;
	int rc;
L
Linus Torvalds 已提交
548

549
	cmd_mask = ATTN_LED_CTRL;
L
Linus Torvalds 已提交
550 551
	switch (value) {
		case 0 :	/* turn off */
552
			slot_cmd = 0x00C0;
L
Linus Torvalds 已提交
553 554
			break;
		case 1:		/* turn on */
555
			slot_cmd = 0x0040;
L
Linus Torvalds 已提交
556 557
			break;
		case 2:		/* turn blink */
558
			slot_cmd = 0x0080;
L
Linus Torvalds 已提交
559 560 561 562
			break;
		default:
			return -1;
	}
563
	rc = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
564
	dbg("%s: SLOTCTRL %x write cmd %x\n",
565
	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
566

L
Linus Torvalds 已提交
567 568 569 570 571
	return rc;
}

static void hpc_set_green_led_on(struct slot *slot)
{
572
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
573
	u16 slot_cmd;
574
	u16 cmd_mask;
575

576 577
	slot_cmd = 0x0100;
	cmd_mask = PWR_LED_CTRL;
578
	pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
579
	dbg("%s: SLOTCTRL %x write cmd %x\n",
580
	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
581 582 583 584
}

static void hpc_set_green_led_off(struct slot *slot)
{
585
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
586
	u16 slot_cmd;
587
	u16 cmd_mask;
L
Linus Torvalds 已提交
588

589 590
	slot_cmd = 0x0300;
	cmd_mask = PWR_LED_CTRL;
591
	pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
592
	dbg("%s: SLOTCTRL %x write cmd %x\n",
593
	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
594 595 596 597
}

static void hpc_set_green_led_blink(struct slot *slot)
{
598
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
599
	u16 slot_cmd;
600
	u16 cmd_mask;
601

602 603
	slot_cmd = 0x0200;
	cmd_mask = PWR_LED_CTRL;
604
	pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
605
	dbg("%s: SLOTCTRL %x write cmd %x\n",
606
	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
607 608 609 610
}

static void hpc_release_ctlr(struct controller *ctrl)
{
611 612
	/* Mask Hot-plug Interrupt Enable */
	if (pcie_write_cmd(ctrl, 0, HP_INTR_ENABLE | CMD_CMPL_INTR_ENABLE))
613
		err("%s: Cannot mask hotplug interrupt enable\n", __func__);
614

K
Kenji Kaneshige 已提交
615 616
	/* Free interrupt handler or interrupt polling timer */
	pciehp_free_irq(ctrl);
L
Linus Torvalds 已提交
617

K
Kenji Kaneshige 已提交
618 619 620 621 622 623
	/*
	 * If this is the last controller to be released, destroy the
	 * pciehp work queue
	 */
	if (atomic_dec_and_test(&pciehp_num_controllers))
		destroy_workqueue(pciehp_wq);
L
Linus Torvalds 已提交
624 625 626 627
}

static int hpc_power_on_slot(struct slot * slot)
{
628
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
629
	u16 slot_cmd;
630 631
	u16 cmd_mask;
	u16 slot_status;
L
Linus Torvalds 已提交
632 633
	int retval = 0;

634
	dbg("%s: slot->hp_slot %x\n", __func__, slot->hp_slot);
L
Linus Torvalds 已提交
635

636
	/* Clear sticky power-fault bit from previous power failures */
637 638
	retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
	if (retval) {
639
		err("%s: Cannot read SLOTSTATUS register\n", __func__);
640 641
		return retval;
	}
642
	slot_status &= PWR_FAULT_DETECTED;
643 644 645 646
	if (slot_status) {
		retval = pciehp_writew(ctrl, SLOTSTATUS, slot_status);
		if (retval) {
			err("%s: Cannot write to SLOTSTATUS register\n",
647
			    __func__);
648 649 650
			return retval;
		}
	}
L
Linus Torvalds 已提交
651

652 653
	slot_cmd = POWER_ON;
	cmd_mask = PWR_CTRL;
654
	/* Enable detection that we turned off at slot power-off time */
655
	if (!pciehp_poll_mode) {
656 657 658 659
		slot_cmd |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
		cmd_mask |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
660
	}
L
Linus Torvalds 已提交
661

662
	retval = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
L
Linus Torvalds 已提交
663 664

	if (retval) {
665
		err("%s: Write %x command failed!\n", __func__, slot_cmd);
L
Linus Torvalds 已提交
666 667
		return -1;
	}
668
	dbg("%s: SLOTCTRL %x write cmd %x\n",
669
	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
L
Linus Torvalds 已提交
670 671 672 673

	return retval;
}

674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
static inline int pcie_mask_bad_dllp(struct controller *ctrl)
{
	struct pci_dev *dev = ctrl->pci_dev;
	int pos;
	u32 reg;

	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
	if (!pos)
		return 0;
	pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, &reg);
	if (reg & PCI_ERR_COR_BAD_DLLP)
		return 0;
	reg |= PCI_ERR_COR_BAD_DLLP;
	pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg);
	return 1;
}

static inline void pcie_unmask_bad_dllp(struct controller *ctrl)
{
	struct pci_dev *dev = ctrl->pci_dev;
	u32 reg;
	int pos;

	pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
	if (!pos)
		return;
	pci_read_config_dword(dev, pos + PCI_ERR_COR_MASK, &reg);
	if (!(reg & PCI_ERR_COR_BAD_DLLP))
		return;
	reg &= ~PCI_ERR_COR_BAD_DLLP;
	pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, reg);
}

L
Linus Torvalds 已提交
707 708
static int hpc_power_off_slot(struct slot * slot)
{
709
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
710
	u16 slot_cmd;
711
	u16 cmd_mask;
L
Linus Torvalds 已提交
712
	int retval = 0;
713
	int changed;
L
Linus Torvalds 已提交
714

715
	dbg("%s: slot->hp_slot %x\n", __func__, slot->hp_slot);
L
Linus Torvalds 已提交
716

717 718 719 720 721 722 723 724
	/*
	 * Set Bad DLLP Mask bit in Correctable Error Mask
	 * Register. This is the workaround against Bad DLLP error
	 * that sometimes happens during turning power off the slot
	 * which conforms to PCI Express 1.0a spec.
	 */
	changed = pcie_mask_bad_dllp(ctrl);

725 726
	slot_cmd = POWER_OFF;
	cmd_mask = PWR_CTRL;
727 728 729 730 731 732 733
	/*
	 * If we get MRL or presence detect interrupts now, the isr
	 * will notice the sticky power-fault bit too and issue power
	 * indicator change commands. This will lead to an endless loop
	 * of command completions, since the power-fault bit remains on
	 * till the slot is powered on again.
	 */
734
	if (!pciehp_poll_mode) {
735 736 737 738
		slot_cmd &= ~(PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			      PRSN_DETECT_ENABLE);
		cmd_mask |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
739
	}
L
Linus Torvalds 已提交
740

741
	retval = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
L
Linus Torvalds 已提交
742
	if (retval) {
743
		err("%s: Write command failed!\n", __func__);
744 745
		retval = -1;
		goto out;
L
Linus Torvalds 已提交
746
	}
747
	dbg("%s: SLOTCTRL %x write cmd %x\n",
748
	    __func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
749
 out:
750 751 752
	if (changed)
		pcie_unmask_bad_dllp(ctrl);

L
Linus Torvalds 已提交
753 754 755
	return retval;
}

756
static irqreturn_t pcie_isr(int irq, void *dev_id)
L
Linus Torvalds 已提交
757
{
758
	struct controller *ctrl = (struct controller *)dev_id;
759
	u16 detected, intr_loc;
760
	struct slot *p_slot;
L
Linus Torvalds 已提交
761

762 763 764 765 766 767 768 769 770
	/*
	 * In order to guarantee that all interrupt events are
	 * serviced, we need to re-inspect Slot Status register after
	 * clearing what is presumed to be the last pending interrupt.
	 */
	intr_loc = 0;
	do {
		if (pciehp_readw(ctrl, SLOTSTATUS, &detected)) {
			err("%s: Cannot read SLOTSTATUS\n", __func__);
L
Linus Torvalds 已提交
771 772 773
			return IRQ_NONE;
		}

774 775 776 777 778
		detected &= (ATTN_BUTTN_PRESSED | PWR_FAULT_DETECTED |
			     MRL_SENS_CHANGED | PRSN_DETECT_CHANGED |
			     CMD_COMPLETED);
		intr_loc |= detected;
		if (!intr_loc)
L
Linus Torvalds 已提交
779
			return IRQ_NONE;
780
		if (detected && pciehp_writew(ctrl, SLOTSTATUS, detected)) {
781
			err("%s: Cannot write to SLOTSTATUS\n", __func__);
L
Linus Torvalds 已提交
782 783
			return IRQ_NONE;
		}
784
	} while (detected);
785

786
	dbg("%s: intr_loc %x\n", __FUNCTION__, intr_loc);
787

788
	/* Check Command Complete Interrupt Pending */
L
Linus Torvalds 已提交
789
	if (intr_loc & CMD_COMPLETED) {
790
		ctrl->cmd_busy = 0;
791
		smp_mb();
792
		wake_up(&ctrl->queue);
L
Linus Torvalds 已提交
793 794
	}

795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811
	if (!(intr_loc & ~CMD_COMPLETED))
		return IRQ_HANDLED;

	/*
	 * Return without handling events if this handler routine is
	 * called before controller initialization is done. This may
	 * happen if hotplug event or another interrupt that shares
	 * the IRQ with pciehp arrives before slot initialization is
	 * done after interrupt handler is registered.
	 *
	 * FIXME - Need more structural fixes. We need to be ready to
	 * handle the event before installing interrupt handler.
	 */
	p_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
	if (!p_slot || !p_slot->hpc_ops)
		return IRQ_HANDLED;

812
	/* Check MRL Sensor Changed */
813
	if (intr_loc & MRL_SENS_CHANGED)
814
		pciehp_handle_switch_change(p_slot);
815

816
	/* Check Attention Button Pressed */
817
	if (intr_loc & ATTN_BUTTN_PRESSED)
818
		pciehp_handle_attention_button(p_slot);
819

820
	/* Check Presence Detect Changed */
821
	if (intr_loc & PRSN_DETECT_CHANGED)
822
		pciehp_handle_presence_change(p_slot);
823

824
	/* Check Power Fault Detected */
825
	if (intr_loc & PWR_FAULT_DETECTED)
826
		pciehp_handle_power_fault(p_slot);
827

L
Linus Torvalds 已提交
828 829 830
	return IRQ_HANDLED;
}

831
static int hpc_get_max_lnk_speed(struct slot *slot, enum pci_bus_speed *value)
L
Linus Torvalds 已提交
832
{
833
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
834 835 836 837
	enum pcie_link_speed lnk_speed;
	u32	lnk_cap;
	int retval = 0;

838
	retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
L
Linus Torvalds 已提交
839
	if (retval) {
840
		err("%s: Cannot read LNKCAP register\n", __func__);
L
Linus Torvalds 已提交
841 842 843 844 845 846 847 848 849 850 851 852 853 854
		return retval;
	}

	switch (lnk_cap & 0x000F) {
	case 1:
		lnk_speed = PCIE_2PT5GB;
		break;
	default:
		lnk_speed = PCIE_LNK_SPEED_UNKNOWN;
		break;
	}

	*value = lnk_speed;
	dbg("Max link speed = %d\n", lnk_speed);
K
Kenji Kaneshige 已提交
855

L
Linus Torvalds 已提交
856 857 858
	return retval;
}

859 860
static int hpc_get_max_lnk_width(struct slot *slot,
				 enum pcie_link_width *value)
L
Linus Torvalds 已提交
861
{
862
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
863 864 865 866
	enum pcie_link_width lnk_wdth;
	u32	lnk_cap;
	int retval = 0;

867
	retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
L
Linus Torvalds 已提交
868
	if (retval) {
869
		err("%s: Cannot read LNKCAP register\n", __func__);
L
Linus Torvalds 已提交
870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
		return retval;
	}

	switch ((lnk_cap & 0x03F0) >> 4){
	case 0:
		lnk_wdth = PCIE_LNK_WIDTH_RESRV;
		break;
	case 1:
		lnk_wdth = PCIE_LNK_X1;
		break;
	case 2:
		lnk_wdth = PCIE_LNK_X2;
		break;
	case 4:
		lnk_wdth = PCIE_LNK_X4;
		break;
	case 8:
		lnk_wdth = PCIE_LNK_X8;
		break;
	case 12:
		lnk_wdth = PCIE_LNK_X12;
		break;
	case 16:
		lnk_wdth = PCIE_LNK_X16;
		break;
	case 32:
		lnk_wdth = PCIE_LNK_X32;
		break;
	default:
		lnk_wdth = PCIE_LNK_WIDTH_UNKNOWN;
		break;
	}

	*value = lnk_wdth;
	dbg("Max link width = %d\n", lnk_wdth);
K
Kenji Kaneshige 已提交
905

L
Linus Torvalds 已提交
906 907 908
	return retval;
}

909
static int hpc_get_cur_lnk_speed(struct slot *slot, enum pci_bus_speed *value)
L
Linus Torvalds 已提交
910
{
911
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
912 913 914 915
	enum pcie_link_speed lnk_speed = PCI_SPEED_UNKNOWN;
	int retval = 0;
	u16 lnk_status;

916
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
917
	if (retval) {
918
		err("%s: Cannot read LNKSTATUS register\n", __func__);
L
Linus Torvalds 已提交
919 920 921 922 923 924 925 926 927 928 929 930 931 932
		return retval;
	}

	switch (lnk_status & 0x0F) {
	case 1:
		lnk_speed = PCIE_2PT5GB;
		break;
	default:
		lnk_speed = PCIE_LNK_SPEED_UNKNOWN;
		break;
	}

	*value = lnk_speed;
	dbg("Current link speed = %d\n", lnk_speed);
K
Kenji Kaneshige 已提交
933

L
Linus Torvalds 已提交
934 935 936
	return retval;
}

937 938
static int hpc_get_cur_lnk_width(struct slot *slot,
				 enum pcie_link_width *value)
L
Linus Torvalds 已提交
939
{
940
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
941 942 943 944
	enum pcie_link_width lnk_wdth = PCIE_LNK_WIDTH_UNKNOWN;
	int retval = 0;
	u16 lnk_status;

945
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
946
	if (retval) {
947
		err("%s: Cannot read LNKSTATUS register\n", __func__);
L
Linus Torvalds 已提交
948 949
		return retval;
	}
950

L
Linus Torvalds 已提交
951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982
	switch ((lnk_status & 0x03F0) >> 4){
	case 0:
		lnk_wdth = PCIE_LNK_WIDTH_RESRV;
		break;
	case 1:
		lnk_wdth = PCIE_LNK_X1;
		break;
	case 2:
		lnk_wdth = PCIE_LNK_X2;
		break;
	case 4:
		lnk_wdth = PCIE_LNK_X4;
		break;
	case 8:
		lnk_wdth = PCIE_LNK_X8;
		break;
	case 12:
		lnk_wdth = PCIE_LNK_X12;
		break;
	case 16:
		lnk_wdth = PCIE_LNK_X16;
		break;
	case 32:
		lnk_wdth = PCIE_LNK_X32;
		break;
	default:
		lnk_wdth = PCIE_LNK_WIDTH_UNKNOWN;
		break;
	}

	*value = lnk_wdth;
	dbg("Current link width = %d\n", lnk_wdth);
K
Kenji Kaneshige 已提交
983

L
Linus Torvalds 已提交
984 985 986 987 988 989 990 991 992 993 994
	return retval;
}

static struct hpc_ops pciehp_hpc_ops = {
	.power_on_slot			= hpc_power_on_slot,
	.power_off_slot			= hpc_power_off_slot,
	.set_attention_status		= hpc_set_attention_status,
	.get_power_status		= hpc_get_power_status,
	.get_attention_status		= hpc_get_attention_status,
	.get_latch_status		= hpc_get_latch_status,
	.get_adapter_status		= hpc_get_adapter_status,
995 996
	.get_emi_status			= hpc_get_emi_status,
	.toggle_emi			= hpc_toggle_emi,
L
Linus Torvalds 已提交
997 998 999 1000 1001

	.get_max_bus_speed		= hpc_get_max_lnk_speed,
	.get_cur_bus_speed		= hpc_get_cur_lnk_speed,
	.get_max_lnk_width		= hpc_get_max_lnk_width,
	.get_cur_lnk_width		= hpc_get_cur_lnk_width,
1002

L
Linus Torvalds 已提交
1003 1004 1005 1006
	.query_power_fault		= hpc_query_power_fault,
	.green_led_on			= hpc_set_green_led_on,
	.green_led_off			= hpc_set_green_led_off,
	.green_led_blink		= hpc_set_green_led_blink,
1007

L
Linus Torvalds 已提交
1008 1009 1010 1011
	.release_ctlr			= hpc_release_ctlr,
	.check_lnk_status		= hpc_check_lnk_status,
};

M
Mark Lord 已提交
1012 1013
static int pcie_init_hardware_part1(struct controller *ctrl,
				    struct pcie_device *dev)
L
Linus Torvalds 已提交
1014
{
1015 1016 1017 1018 1019 1020
	/* Clear all remaining event bits in Slot Status register */
	if (pciehp_writew(ctrl, SLOTSTATUS, 0x1f)) {
		err("%s: Cannot write to SLOTSTATUS register\n", __func__);
		return -1;
	}

L
Linus Torvalds 已提交
1021
	/* Mask Hot-plug Interrupt Enable */
1022 1023
	if (pcie_write_cmd(ctrl, 0, HP_INTR_ENABLE | CMD_CMPL_INTR_ENABLE)) {
		err("%s: Cannot mask hotplug interrupt enable\n", __func__);
M
Mark Lord 已提交
1024
		return -1;
L
Linus Torvalds 已提交
1025
	}
M
Mark Lord 已提交
1026 1027
	return 0;
}
1028

M
Mark Lord 已提交
1029 1030
int pcie_init_hardware_part2(struct controller *ctrl, struct pcie_device *dev)
{
1031
	u16 cmd, mask;
L
Linus Torvalds 已提交
1032

1033
	cmd = PRSN_DETECT_ENABLE;
1034
	if (ATTN_BUTTN(ctrl))
1035
		cmd |= ATTN_BUTTN_ENABLE;
1036
	if (POWER_CTRL(ctrl))
1037
		cmd |= PWR_FAULT_DETECT_ENABLE;
1038
	if (MRL_SENS(ctrl))
1039 1040 1041 1042 1043 1044 1045 1046 1047
		cmd |= MRL_DETECT_ENABLE;
	if (!pciehp_poll_mode)
		cmd |= HP_INTR_ENABLE;

	mask = PRSN_DETECT_ENABLE | ATTN_BUTTN_ENABLE |
		PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE | HP_INTR_ENABLE;

	if (pcie_write_cmd(ctrl, cmd, mask)) {
		err("%s: Cannot enable software notification\n", __func__);
1048
		return -1;
L
Linus Torvalds 已提交
1049
	}
1050

L
Linus Torvalds 已提交
1051 1052
	return 0;
}
1053

K
Kenji Kaneshige 已提交
1054
static inline void dbg_ctrl(struct controller *ctrl)
1055
{
K
Kenji Kaneshige 已提交
1056 1057 1058
	int i;
	u16 reg16;
	struct pci_dev *pdev = ctrl->pci_dev;
1059

K
Kenji Kaneshige 已提交
1060 1061
	if (!pciehp_debug)
		return;
1062

K
Kenji Kaneshige 已提交
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
	dbg("Hotplug Controller:\n");
	dbg("  Seg/Bus/Dev/Func/IRQ : %s IRQ %d\n", pci_name(pdev), pdev->irq);
	dbg("  Vendor ID            : 0x%04x\n", pdev->vendor);
	dbg("  Device ID            : 0x%04x\n", pdev->device);
	dbg("  Subsystem ID         : 0x%04x\n", pdev->subsystem_device);
	dbg("  Subsystem Vendor ID  : 0x%04x\n", pdev->subsystem_vendor);
	dbg("  PCIe Cap offset      : 0x%02x\n", ctrl->cap_base);
	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
		if (!pci_resource_len(pdev, i))
			continue;
		dbg("  PCI resource [%d]     : 0x%llx@0x%llx\n", i,
		    (unsigned long long)pci_resource_len(pdev, i),
		    (unsigned long long)pci_resource_start(pdev, i));
1076
	}
K
Kenji Kaneshige 已提交
1077 1078 1079 1080 1081 1082 1083 1084 1085
	dbg("Slot Capabilities      : 0x%08x\n", ctrl->slot_cap);
	dbg("  Physical Slot Number : %d\n", ctrl->first_slot);
	dbg("  Attention Button     : %3s\n", ATTN_BUTTN(ctrl) ? "yes" : "no");
	dbg("  Power Controller     : %3s\n", POWER_CTRL(ctrl) ? "yes" : "no");
	dbg("  MRL Sensor           : %3s\n", MRL_SENS(ctrl)   ? "yes" : "no");
	dbg("  Attention Indicator  : %3s\n", ATTN_LED(ctrl)   ? "yes" : "no");
	dbg("  Power Indicator      : %3s\n", PWR_LED(ctrl)    ? "yes" : "no");
	dbg("  Hot-Plug Surprise    : %3s\n", HP_SUPR_RM(ctrl) ? "yes" : "no");
	dbg("  EMI Present          : %3s\n", EMI(ctrl)        ? "yes" : "no");
K
Kenji Kaneshige 已提交
1086
	dbg("  Comamnd Completed    : %3s\n", NO_CMD_CMPL(ctrl)? "no" : "yes");
K
Kenji Kaneshige 已提交
1087 1088
	pciehp_readw(ctrl, SLOTSTATUS, &reg16);
	dbg("Slot Status            : 0x%04x\n", reg16);
1089
	pciehp_readw(ctrl, SLOTCTRL, &reg16);
K
Kenji Kaneshige 已提交
1090 1091
	dbg("Slot Control           : 0x%04x\n", reg16);
}
1092

K
Kenji Kaneshige 已提交
1093 1094 1095 1096
int pcie_init(struct controller *ctrl, struct pcie_device *dev)
{
	u32 slot_cap;
	struct pci_dev *pdev = dev->port;
1097

K
Kenji Kaneshige 已提交
1098 1099 1100 1101
	ctrl->pci_dev = pdev;
	ctrl->cap_base = pci_find_capability(pdev, PCI_CAP_ID_EXP);
	if (!ctrl->cap_base) {
		err("%s: Cannot find PCI Express capability\n", __func__);
1102 1103
		goto abort;
	}
K
Kenji Kaneshige 已提交
1104
	if (pciehp_readl(ctrl, SLOTCAP, &slot_cap)) {
1105
		err("%s: Cannot read SLOTCAP register\n", __func__);
1106 1107 1108
		goto abort;
	}

K
Kenji Kaneshige 已提交
1109 1110 1111 1112 1113
	ctrl->slot_cap = slot_cap;
	ctrl->first_slot = slot_cap >> 19;
	ctrl->slot_device_offset = 0;
	ctrl->num_slots = 1;
	ctrl->hpc_ops = &pciehp_hpc_ops;
1114 1115 1116
	mutex_init(&ctrl->crit_sect);
	mutex_init(&ctrl->ctrl_lock);
	init_waitqueue_head(&ctrl->queue);
K
Kenji Kaneshige 已提交
1117
	dbg_ctrl(ctrl);
K
Kenji Kaneshige 已提交
1118 1119 1120 1121 1122 1123 1124 1125 1126
	/*
	 * Controller doesn't notify of command completion if the "No
	 * Command Completed Support" bit is set in Slot Capability
	 * register or the controller supports none of power
	 * controller, attention led, power led and EMI.
	 */
	if (NO_CMD_CMPL(ctrl) ||
	    !(POWER_CTRL(ctrl) | ATTN_LED(ctrl) | PWR_LED(ctrl) | EMI(ctrl)))
	    ctrl->no_cmd_complete = 1;
1127

K
Kenji Kaneshige 已提交
1128 1129 1130
	info("HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n",
	     pdev->vendor, pdev->device,
	     pdev->subsystem_vendor, pdev->subsystem_device);
1131

K
Kenji Kaneshige 已提交
1132
	if (pcie_init_hardware_part1(ctrl, dev))
M
Mark Lord 已提交
1133 1134
		goto abort;

K
Kenji Kaneshige 已提交
1135 1136
	if (pciehp_request_irq(ctrl))
		goto abort;
M
Mark Lord 已提交
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148

	/*
	 * If this is the first controller to be initialized,
	 * initialize the pciehp work queue
	 */
	if (atomic_add_return(1, &pciehp_num_controllers) == 1) {
		pciehp_wq = create_singlethread_workqueue("pciehpd");
		if (!pciehp_wq) {
			goto abort_free_irq;
		}
	}

K
Kenji Kaneshige 已提交
1149 1150 1151 1152 1153
	if (pcie_init_hardware_part2(ctrl, dev))
		goto abort_free_irq;

	return 0;

M
Mark Lord 已提交
1154
abort_free_irq:
K
Kenji Kaneshige 已提交
1155
	pciehp_free_irq(ctrl);
1156 1157 1158
abort:
	return -1;
}