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
static inline int pcie_poll_cmd(struct controller *ctrl)
{
	u16 slot_status;
	int timeout = 1000;

K
Kenji Kaneshige 已提交
255 256 257 258 259 260 261
	if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status)) {
		if (slot_status & CMD_COMPLETED) {
			pciehp_writew(ctrl, SLOTSTATUS, CMD_COMPLETED);
			return 1;
		}
	}
	while (timeout > 1000) {
262 263
		msleep(10);
		timeout -= 10;
K
Kenji Kaneshige 已提交
264 265 266 267 268 269
		if (!pciehp_readw(ctrl, SLOTSTATUS, &slot_status)) {
			if (slot_status & CMD_COMPLETED) {
				pciehp_writew(ctrl, SLOTSTATUS, CMD_COMPLETED);
				return 1;
			}
		}
270 271 272 273
	}
	return 0;	/* timeout */
}

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

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

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

300 301
	mutex_lock(&ctrl->ctrl_lock);

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

K
Kenji Kaneshige 已提交
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
	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 已提交
330 331
	}

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

338
	slot_ctrl &= ~mask;
K
Kenji Kaneshige 已提交
339 340 341 342
	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;
343 344

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

350 351 352
	/*
	 * Wait for command completion.
	 */
353 354 355 356 357 358 359 360 361 362
	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;
363
                pcie_wait_cmd(ctrl, poll);
364
	}
365 366
 out:
	mutex_unlock(&ctrl->ctrl_lock);
L
Linus Torvalds 已提交
367 368 369 370 371 372 373 374
	return retval;
}

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

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

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

	return retval;
}

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

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

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

	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;
}

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

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

	pwr_state = (slot_ctrl & PWR_CTRL) >> 10;

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

	return retval;
}

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

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

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

	return 0;
}

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

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

	return 0;
}

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

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

512
	return pwr_fault;
L
Linus Torvalds 已提交
513 514
}

515 516 517 518 519 520 521 522
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) {
523
		err("%s : Cannot check EMI status\n", __func__);
524 525 526 527 528 529 530 531 532
		return retval;
	}
	*status = (slot_status & EMI_STATE) >> EMI_STATUS_BIT;

	return retval;
}

static int hpc_toggle_emi(struct slot *slot)
{
533 534 535
	u16 slot_cmd;
	u16 cmd_mask;
	int rc;
536

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

542 543 544
	return rc;
}

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

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

L
Linus Torvalds 已提交
570 571 572 573 574
	return rc;
}

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

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

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

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

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

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

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

K
Kenji Kaneshige 已提交
618 619
	/* Free interrupt handler or interrupt polling timer */
	pciehp_free_irq(ctrl);
L
Linus Torvalds 已提交
620

K
Kenji Kaneshige 已提交
621 622 623 624 625 626
	/*
	 * 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 已提交
627 628 629 630
}

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

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

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

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

665
	retval = pcie_write_cmd(ctrl, slot_cmd, cmd_mask);
L
Linus Torvalds 已提交
666 667

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

	return retval;
}

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 707 708 709
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 已提交
710 711
static int hpc_power_off_slot(struct slot * slot)
{
712
	struct controller *ctrl = slot->ctrl;
L
Linus Torvalds 已提交
713
	u16 slot_cmd;
714
	u16 cmd_mask;
L
Linus Torvalds 已提交
715
	int retval = 0;
716
	int changed;
L
Linus Torvalds 已提交
717

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

720 721 722 723 724 725 726 727
	/*
	 * 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);

728 729
	slot_cmd = POWER_OFF;
	cmd_mask = PWR_CTRL;
730 731 732 733 734 735 736
	/*
	 * 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.
	 */
737
	if (!pciehp_poll_mode) {
738 739 740 741
		slot_cmd &= ~(PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			      PRSN_DETECT_ENABLE);
		cmd_mask |= (PWR_FAULT_DETECT_ENABLE | MRL_DETECT_ENABLE |
			     PRSN_DETECT_ENABLE);
742
	}
L
Linus Torvalds 已提交
743

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

L
Linus Torvalds 已提交
756 757 758
	return retval;
}

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

765 766 767 768 769 770 771 772 773
	/*
	 * 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 已提交
774 775 776
			return IRQ_NONE;
		}

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

789
	dbg("%s: intr_loc %x\n", __FUNCTION__, intr_loc);
790

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

798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
	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;

815
	/* Check MRL Sensor Changed */
816
	if (intr_loc & MRL_SENS_CHANGED)
817
		pciehp_handle_switch_change(p_slot);
818

819
	/* Check Attention Button Pressed */
820
	if (intr_loc & ATTN_BUTTN_PRESSED)
821
		pciehp_handle_attention_button(p_slot);
822

823
	/* Check Presence Detect Changed */
824
	if (intr_loc & PRSN_DETECT_CHANGED)
825
		pciehp_handle_presence_change(p_slot);
826

827
	/* Check Power Fault Detected */
828
	if (intr_loc & PWR_FAULT_DETECTED)
829
		pciehp_handle_power_fault(p_slot);
830

L
Linus Torvalds 已提交
831 832 833
	return IRQ_HANDLED;
}

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

841
	retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
L
Linus Torvalds 已提交
842
	if (retval) {
843
		err("%s: Cannot read LNKCAP register\n", __func__);
L
Linus Torvalds 已提交
844 845 846 847 848 849 850 851 852 853 854 855 856 857
		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 已提交
858

L
Linus Torvalds 已提交
859 860 861
	return retval;
}

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

870
	retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
L
Linus Torvalds 已提交
871
	if (retval) {
872
		err("%s: Cannot read LNKCAP register\n", __func__);
L
Linus Torvalds 已提交
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 905 906 907
		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 已提交
908

L
Linus Torvalds 已提交
909 910 911
	return retval;
}

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

919
	retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
L
Linus Torvalds 已提交
920
	if (retval) {
921
		err("%s: Cannot read LNKSTATUS register\n", __func__);
L
Linus Torvalds 已提交
922 923 924 925 926 927 928 929 930 931 932 933 934 935
		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 已提交
936

L
Linus Torvalds 已提交
937 938 939
	return retval;
}

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

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

L
Linus Torvalds 已提交
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 983 984 985
	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 已提交
986

L
Linus Torvalds 已提交
987 988 989 990 991 992 993 994 995 996 997
	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,
998 999
	.get_emi_status			= hpc_get_emi_status,
	.toggle_emi			= hpc_toggle_emi,
L
Linus Torvalds 已提交
1000 1001 1002 1003 1004

	.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,
1005

L
Linus Torvalds 已提交
1006 1007 1008 1009
	.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,
1010

L
Linus Torvalds 已提交
1011 1012 1013 1014
	.release_ctlr			= hpc_release_ctlr,
	.check_lnk_status		= hpc_check_lnk_status,
};

M
Mark Lord 已提交
1015 1016
static int pcie_init_hardware_part1(struct controller *ctrl,
				    struct pcie_device *dev)
L
Linus Torvalds 已提交
1017
{
1018 1019 1020 1021 1022 1023
	/* 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 已提交
1024
	/* Mask Hot-plug Interrupt Enable */
1025 1026
	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 已提交
1027
		return -1;
L
Linus Torvalds 已提交
1028
	}
M
Mark Lord 已提交
1029 1030
	return 0;
}
1031

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

1036
	cmd = PRSN_DETECT_ENABLE;
1037
	if (ATTN_BUTTN(ctrl))
1038
		cmd |= ATTN_BUTTN_ENABLE;
1039
	if (POWER_CTRL(ctrl))
1040
		cmd |= PWR_FAULT_DETECT_ENABLE;
1041
	if (MRL_SENS(ctrl))
1042 1043 1044 1045 1046 1047 1048 1049 1050
		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__);
1051
		return -1;
L
Linus Torvalds 已提交
1052
	}
1053

L
Linus Torvalds 已提交
1054 1055
	return 0;
}
1056

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

K
Kenji Kaneshige 已提交
1063 1064
	if (!pciehp_debug)
		return;
1065

K
Kenji Kaneshige 已提交
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
	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));
1079
	}
K
Kenji Kaneshige 已提交
1080 1081 1082 1083 1084 1085 1086 1087 1088
	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 已提交
1089
	dbg("  Comamnd Completed    : %3s\n", NO_CMD_CMPL(ctrl)? "no" : "yes");
K
Kenji Kaneshige 已提交
1090 1091
	pciehp_readw(ctrl, SLOTSTATUS, &reg16);
	dbg("Slot Status            : 0x%04x\n", reg16);
1092
	pciehp_readw(ctrl, SLOTCTRL, &reg16);
K
Kenji Kaneshige 已提交
1093 1094
	dbg("Slot Control           : 0x%04x\n", reg16);
}
1095

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

K
Kenji Kaneshige 已提交
1101 1102 1103 1104
	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__);
1105 1106
		goto abort;
	}
K
Kenji Kaneshige 已提交
1107
	if (pciehp_readl(ctrl, SLOTCAP, &slot_cap)) {
1108
		err("%s: Cannot read SLOTCAP register\n", __func__);
1109 1110 1111
		goto abort;
	}

K
Kenji Kaneshige 已提交
1112 1113 1114 1115 1116
	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;
1117 1118 1119
	mutex_init(&ctrl->crit_sect);
	mutex_init(&ctrl->ctrl_lock);
	init_waitqueue_head(&ctrl->queue);
K
Kenji Kaneshige 已提交
1120
	dbg_ctrl(ctrl);
K
Kenji Kaneshige 已提交
1121 1122 1123 1124 1125 1126 1127 1128 1129
	/*
	 * 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;
1130

K
Kenji Kaneshige 已提交
1131 1132 1133
	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);
1134

K
Kenji Kaneshige 已提交
1135
	if (pcie_init_hardware_part1(ctrl, dev))
M
Mark Lord 已提交
1136 1137
		goto abort;

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

	/*
	 * 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 已提交
1152 1153 1154 1155 1156
	if (pcie_init_hardware_part2(ctrl, dev))
		goto abort_free_irq;

	return 0;

M
Mark Lord 已提交
1157
abort_free_irq:
K
Kenji Kaneshige 已提交
1158
	pciehp_free_irq(ctrl);
1159 1160 1161
abort:
	return -1;
}