PageRenderTime 32ms CodeModel.GetById 14ms app.highlight 12ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/ppc64/kernel/iSeries_pci_reset.c

https://bitbucket.org/evzijst/gittest
C | 104 lines | 56 code | 7 blank | 41 comment | 11 complexity | 8bd64fab357dc5b91376398c7f58c47f MD5 | raw file
  1#define PCIFR(...)
  2/************************************************************************/
  3/* File iSeries_pci_reset.c created by Allan Trautman on Mar 21 2001.   */
  4/************************************************************************/
  5/* This code supports the pci interface on the IBM iSeries systems.     */
  6/* Copyright (C) 20yy  <Allan H Trautman> <IBM Corp>                    */
  7/*                                                                      */
  8/* This program is free software; you can redistribute it and/or modify */
  9/* it under the terms of the GNU General Public License as published by */
 10/* the Free Software Foundation; either version 2 of the License, or    */
 11/* (at your option) any later version.                                  */
 12/*                                                                      */
 13/* This program is distributed in the hope that it will be useful,      */ 
 14/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
 15/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
 16/* GNU General Public License for more details.                         */
 17/*                                                                      */
 18/* You should have received a copy of the GNU General Public License    */ 
 19/* along with this program; if not, write to the:                       */
 20/* Free Software Foundation, Inc.,                                      */ 
 21/* 59 Temple Place, Suite 330,                                          */ 
 22/* Boston, MA  02111-1307  USA                                          */
 23/************************************************************************/
 24/* Change Activity:                                                     */
 25/*   Created, March 20, 2001                                            */
 26/*   April 30, 2001, Added return codes on functions.                   */
 27/*   September 10, 2001, Ported to ppc64.                               */
 28/* End Change Activity                                                  */
 29/************************************************************************/
 30#include <linux/kernel.h>
 31#include <linux/init.h>
 32#include <linux/module.h>
 33#include <linux/pci.h>
 34#include <linux/irq.h>
 35#include <linux/delay.h>
 36
 37#include <asm/io.h>
 38#include <asm/iSeries/HvCallPci.h>
 39#include <asm/iSeries/HvTypes.h>
 40#include <asm/iSeries/mf.h>
 41#include <asm/pci.h>
 42
 43#include <asm/iSeries/iSeries_pci.h>
 44#include "pci.h"
 45
 46/*
 47 * Interface to toggle the reset line
 48 * Time is in .1 seconds, need for seconds.
 49 */
 50int iSeries_Device_ToggleReset(struct pci_dev *PciDev, int AssertTime,
 51		int DelayTime)
 52{
 53	unsigned int AssertDelay, WaitDelay;
 54	struct iSeries_Device_Node *DeviceNode =
 55		(struct iSeries_Device_Node *)PciDev->sysdata;
 56
 57 	if (DeviceNode == NULL) { 
 58		printk("PCI: Pci Reset Failed, Device Node not found for pci_dev %p\n",
 59				PciDev);
 60		return -1;
 61	}
 62	/*
 63	 * Set defaults, Assert is .5 second, Wait is 3 seconds.
 64	 */
 65	if (AssertTime == 0)
 66		AssertDelay = 500;
 67	else
 68		AssertDelay = AssertTime * 100;
 69
 70	if (DelayTime == 0)
 71		WaitDelay = 3000;
 72	else
 73		WaitDelay = DelayTime * 100;
 74
 75	/*
 76	 * Assert reset
 77	 */
 78	DeviceNode->ReturnCode = HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode),
 79			0x00, DeviceNode->AgentId, 1);
 80	if (DeviceNode->ReturnCode == 0) {
 81		msleep(AssertDelay);			/* Sleep for the time */
 82		DeviceNode->ReturnCode =
 83			HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode),
 84					0x00, DeviceNode->AgentId, 0);
 85
 86		/*
 87   		 * Wait for device to reset
 88		 */
 89		msleep(WaitDelay);
 90	}
 91	if (DeviceNode->ReturnCode == 0)
 92		PCIFR("Slot 0x%04X.%02 Reset\n", ISERIES_BUS(DeviceNode),
 93				DeviceNode->AgentId);
 94	else {
 95		printk("PCI: Slot 0x%04X.%02X Reset Failed, RCode: %04X\n",
 96				ISERIES_BUS(DeviceNode), DeviceNode->AgentId,
 97				DeviceNode->ReturnCode);
 98		PCIFR("Slot 0x%04X.%02X Reset Failed, RCode: %04X\n",
 99				ISERIES_BUS(DeviceNode), DeviceNode->AgentId,
100				DeviceNode->ReturnCode);
101	}
102	return DeviceNode->ReturnCode;
103}
104EXPORT_SYMBOL(iSeries_Device_ToggleReset);