[ppc64] Tidy up various bits of the iSeries code. No significant code changes, from Stephen Rothwell --- arch/ppc64/kernel/HvCall.c | 111 +--------- arch/ppc64/kernel/ItLpQueue.c | 17 - arch/ppc64/kernel/XmPciLpEvent.c | 120 ++++++---- arch/ppc64/kernel/iSeries_IoMmTable.c | 180 ++++++++-------- arch/ppc64/kernel/iSeries_IoMmTable.h | 88 +++---- arch/ppc64/kernel/iSeries_VpdInfo.c | 342 +++++++++++++++---------------- arch/ppc64/kernel/iSeries_pci_reset.c | 65 +++-- arch/ppc64/kernel/iSeries_proc.c | 47 +--- include/asm-ppc64/iSeries/iSeries_proc.h | 7 9 files changed, 460 insertions(+), 517 deletions(-) diff -puN arch/ppc64/kernel/HvCall.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/HvCall.c --- 25/arch/ppc64/kernel/HvCall.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/HvCall.c 2004-01-13 23:22:55.000000000 -0800 @@ -8,108 +8,29 @@ * (at your option) any later version. */ -#include -#include -#include -#include -#include #include +#include #include -#ifndef _HVCALLSC_H #include -#endif -#include - -#ifndef _HVTYPES_H #include -#endif -/*===================================================================== - * Note that this call takes at MOST one page worth of data - */ -int HvCall_readLogBuffer(HvLpIndex lpIndex, void *buffer, u64 bufLen) +void HvCall_writeLogBuffer(const void *buffer, u64 len) { - struct HvLpBufferList *bufList; - u64 bytesLeft = bufLen; - u64 leftThisPage; - u64 curPtr = virt_to_absolute( (unsigned long) buffer ); - u64 retVal; - int npages; - int i; - - npages = 0; - while (bytesLeft) { - npages++; - leftThisPage = ((curPtr & PAGE_MASK) + PAGE_SIZE) - curPtr; - - if (leftThisPage > bytesLeft) - bytesLeft = 0; - else - bytesLeft -= leftThisPage; - - curPtr = (curPtr & PAGE_MASK) + PAGE_SIZE; - } - - if (npages == 0) - return 0; - - bufList = (struct HvLpBufferList *) - kmalloc(npages * sizeof(struct HvLpBufferList), GFP_ATOMIC); - bytesLeft = bufLen; - curPtr = virt_to_absolute( (unsigned long) buffer ); - for(i=0; i bytesLeft) { - bufList[i].len = bytesLeft; - bytesLeft = 0; - } else { - bufList[i].len = leftThisPage; - bytesLeft -= leftThisPage; - } - - curPtr = (curPtr & PAGE_MASK) + PAGE_SIZE; - } - - - retVal = HvCall3(HvCallBaseReadLogBuffer, lpIndex, - virt_to_absolute((unsigned long)bufList), bufLen); - - kfree(bufList); - - return (int)retVal; -} - -/*===================================================================== - */ -void HvCall_writeLogBuffer(const void *buffer, u64 bufLen) -{ - struct HvLpBufferList bufList; - u64 bytesLeft = bufLen; - u64 leftThisPage; - u64 curPtr = virt_to_absolute((unsigned long) buffer); - - while (bytesLeft) { - bufList.addr = curPtr; - - leftThisPage = ((curPtr & PAGE_MASK) + PAGE_SIZE) - curPtr; - - if (leftThisPage > bytesLeft) { - bufList.len = bytesLeft; - bytesLeft = 0; - } else { - bufList.len = leftThisPage; - bytesLeft -= leftThisPage; - } - - + struct HvLpBufferList hv_buf; + u64 left_this_page; + u64 cur = virt_to_absolute((unsigned long)buffer); + + while (len) { + hv_buf.addr = cur; + left_this_page = ((cur & PAGE_MASK) + PAGE_SIZE) - cur; + if (left_this_page > len) + left_this_page = len; + hv_buf.len = left_this_page; + len -= left_this_page; HvCall2(HvCallBaseWriteLogBuffer, - virt_to_absolute((unsigned long) &bufList), - bufList.len); - - curPtr = (curPtr & PAGE_MASK) + PAGE_SIZE; + virt_to_absolute((unsigned long)&hv_buf), + left_this_page); + cur = (cur & PAGE_MASK) + PAGE_SIZE; } } diff -puN arch/ppc64/kernel/ItLpQueue.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/ItLpQueue.c --- 25/arch/ppc64/kernel/ItLpQueue.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/ItLpQueue.c 2004-01-13 23:22:55.000000000 -0800 @@ -147,17 +147,14 @@ unsigned ItLpQueue_process( struct ItLpQ printk(KERN_INFO "Unexpected Lp Event type=%d\n", nextLpEvent->xType ); ItLpQueue_clearValid( nextLpEvent ); - } - else /* No more valid events - * If overflow events are pending - * process them + } else if ( lpQueue->xPlicOverflowIntPending ) + /* + * No more valid events. If overflow events are + * pending process them */ - if ( lpQueue->xPlicOverflowIntPending ) { - HvCallEvent_getOverflowLpEvents( - lpQueue->xIndex); - } - else /* If nothing left then we are done */ - break; + HvCallEvent_getOverflowLpEvents( lpQueue->xIndex); + else + break; } ItLpQueueInProcess = 0; diff -puN arch/ppc64/kernel/XmPciLpEvent.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/XmPciLpEvent.c --- 25/arch/ppc64/kernel/XmPciLpEvent.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/XmPciLpEvent.c 2004-01-13 23:22:55.000000000 -0800 @@ -1,10 +1,10 @@ /* - * File XmPciLpEvent.h created by Wayne Holm on Mon Jan 15 2001. - * - * This module handles PCI interrupt events sent by the iSeries Hypervisor. + * File XmPciLpEvent.h created by Wayne Holm on Mon Jan 15 2001. + * + * This module handles PCI interrupt events sent by the iSeries Hypervisor. */ - +#include #include #include #include @@ -36,14 +36,14 @@ enum XmPciLpEvent_Subtype { }; struct XmPciLpEvent_BusInterrupt { - HvBusNumber busNumber; + HvBusNumber busNumber; HvSubBusNumber subBusNumber; }; struct XmPciLpEvent_NodeInterrupt { - HvBusNumber busNumber; + HvBusNumber busNumber; HvSubBusNumber subBusNumber; - HvAgentId deviceId; + HvAgentId deviceId; }; struct XmPciLpEvent { @@ -53,10 +53,10 @@ struct XmPciLpEvent { u64 alignData; // Align on an 8-byte boundary struct { - u32 fisr; + u32 fisr; HvBusNumber busNumber; HvSubBusNumber subBusNumber; - HvAgentId deviceId; + HvAgentId deviceId; } slotInterrupt; struct XmPciLpEvent_BusInterrupt busFailed; @@ -70,40 +70,52 @@ struct XmPciLpEvent { }; -static void intReceived(struct XmPciLpEvent* eventParm, struct pt_regs* regsParm); +static void intReceived(struct XmPciLpEvent *eventParm, + struct pt_regs *regsParm); -static void XmPciLpEvent_handler( struct HvLpEvent* eventParm, struct pt_regs* regsParm) +static void XmPciLpEvent_handler(struct HvLpEvent *eventParm, + struct pt_regs *regsParm) { - //PPCDBG(PPCDBG_BUSWALK,"XmPciLpEvent_handler, type 0x%x\n",eventParm->xType ); +#ifdef CONFIG_PCI +#if 0 + PPCDBG(PPCDBG_BUSWALK, "XmPciLpEvent_handler, type 0x%x\n", + eventParm->xType); +#endif ++Pci_Event_Count; - if (eventParm && eventParm->xType == HvLpEvent_Type_PciIo) { - switch( eventParm->xFlags.xFunction ) { + if (eventParm && (eventParm->xType == HvLpEvent_Type_PciIo)) { + switch (eventParm->xFlags.xFunction) { case HvLpEvent_Function_Int: - intReceived( (struct XmPciLpEvent*)eventParm, regsParm ); + intReceived((struct XmPciLpEvent *)eventParm, regsParm); break; case HvLpEvent_Function_Ack: - printk(KERN_ERR "XmPciLpEvent.c: unexpected ack received\n"); + printk(KERN_ERR + "XmPciLpEvent.c: unexpected ack received\n"); break; default: - printk(KERN_ERR "XmPciLpEvent.c: unexpected event function %d\n",(int)eventParm->xFlags.xFunction); + printk(KERN_ERR + "XmPciLpEvent.c: unexpected event function %d\n", + (int)eventParm->xFlags.xFunction); break; } - } - else if (eventParm) { - printk(KERN_ERR "XmPciLpEvent.c: Unrecognized PCI event type 0x%x\n",(int)eventParm->xType); - } - else { + } else if (eventParm) + printk(KERN_ERR + "XmPciLpEvent.c: Unrecognized PCI event type 0x%x\n", + (int)eventParm->xType); + else printk(KERN_ERR "XmPciLpEvent.c: NULL event received\n"); - } +#endif } -static void intReceived(struct XmPciLpEvent* eventParm, struct pt_regs* regsParm) +static void intReceived(struct XmPciLpEvent *eventParm, + struct pt_regs *regsParm) { int irq; ++Pci_Interrupt_Count; - //PPCDBG(PPCDBG_BUSWALK,"PCI: XmPciLpEvent.c: intReceived\n"); +#if 0 + PPCDBG(PPCDBG_BUSWALK, "PCI: XmPciLpEvent.c: intReceived\n"); +#endif switch (eventParm->hvLpEvent.xSubtype) { case XmPciLpEvent_SlotInterrupt: @@ -111,33 +123,45 @@ static void intReceived(struct XmPciLpEv /* Dispatch the interrupt handlers for this irq */ ppc_irq_dispatch_handler(regsParm, irq); HvCallPci_eoi(eventParm->eventData.slotInterrupt.busNumber, - eventParm->eventData.slotInterrupt.subBusNumber, - eventParm->eventData.slotInterrupt.deviceId); + eventParm->eventData.slotInterrupt.subBusNumber, + eventParm->eventData.slotInterrupt.deviceId); break; /* Ignore error recovery events for now */ case XmPciLpEvent_BusCreated: - printk(KERN_INFO "XmPciLpEvent.c: system bus %d created\n", eventParm->eventData.busCreated.busNumber); + printk(KERN_INFO "XmPciLpEvent.c: system bus %d created\n", + eventParm->eventData.busCreated.busNumber); break; case XmPciLpEvent_BusError: case XmPciLpEvent_BusFailed: - printk(KERN_INFO "XmPciLpEvent.c: system bus %d failed\n", eventParm->eventData.busFailed.busNumber); + printk(KERN_INFO "XmPciLpEvent.c: system bus %d failed\n", + eventParm->eventData.busFailed.busNumber); break; case XmPciLpEvent_BusRecovered: case XmPciLpEvent_UnQuiesceBus: - printk(KERN_INFO "XmPciLpEvent.c: system bus %d recovered\n", eventParm->eventData.busRecovered.busNumber); + printk(KERN_INFO "XmPciLpEvent.c: system bus %d recovered\n", + eventParm->eventData.busRecovered.busNumber); break; case XmPciLpEvent_NodeFailed: case XmPciLpEvent_BridgeError: - printk(KERN_INFO "XmPciLpEvent.c: multi-adapter bridge %d/%d/%d failed\n", eventParm->eventData.nodeFailed.busNumber, eventParm->eventData.nodeFailed.subBusNumber, eventParm->eventData.nodeFailed.deviceId); + printk(KERN_INFO + "XmPciLpEvent.c: multi-adapter bridge %d/%d/%d failed\n", + eventParm->eventData.nodeFailed.busNumber, + eventParm->eventData.nodeFailed.subBusNumber, + eventParm->eventData.nodeFailed.deviceId); break; case XmPciLpEvent_NodeRecovered: - printk(KERN_INFO "XmPciLpEvent.c: multi-adapter bridge %d/%d/%d recovered\n", eventParm->eventData.nodeRecovered.busNumber, eventParm->eventData.nodeRecovered.subBusNumber, eventParm->eventData.nodeRecovered.deviceId); + printk(KERN_INFO + "XmPciLpEvent.c: multi-adapter bridge %d/%d/%d recovered\n", + eventParm->eventData.nodeRecovered.busNumber, + eventParm->eventData.nodeRecovered.subBusNumber, + eventParm->eventData.nodeRecovered.deviceId); break; default: - printk(KERN_ERR "XmPciLpEvent.c: unrecognized event subtype 0x%x\n", - eventParm->hvLpEvent.xSubtype); + printk(KERN_ERR + "XmPciLpEvent.c: unrecognized event subtype 0x%x\n", + eventParm->hvLpEvent.xSubtype); break; - }; + } } @@ -145,18 +169,22 @@ static void intReceived(struct XmPciLpEv int XmPciLpEvent_init() { int xRc; - PPCDBG(PPCDBG_BUSWALK,"XmPciLpEvent_init, Register Event type 0x%04X\n",HvLpEvent_Type_PciIo); - xRc = HvLpEvent_registerHandler(HvLpEvent_Type_PciIo, &XmPciLpEvent_handler); + PPCDBG(PPCDBG_BUSWALK, + "XmPciLpEvent_init, Register Event type 0x%04X\n", + HvLpEvent_Type_PciIo); + + xRc = HvLpEvent_registerHandler(HvLpEvent_Type_PciIo, + &XmPciLpEvent_handler); if (xRc == 0) { xRc = HvLpEvent_openPath(HvLpEvent_Type_PciIo, 0); - if (xRc != 0) { - printk(KERN_ERR "XmPciLpEvent.c: open event path failed with rc 0x%x\n", xRc); - } - } - else { - printk(KERN_ERR "XmPciLpEvent.c: register handler failed with rc 0x%x\n", xRc); - } - return xRc; + if (xRc != 0) + printk(KERN_ERR + "XmPciLpEvent.c: open event path failed with rc 0x%x\n", + xRc); + } else + printk(KERN_ERR + "XmPciLpEvent.c: register handler failed with rc 0x%x\n", + xRc); + return xRc; } - diff -puN arch/ppc64/kernel/iSeries_IoMmTable.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/iSeries_IoMmTable.c --- 25/arch/ppc64/kernel/iSeries_IoMmTable.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/iSeries_IoMmTable.c 2004-01-13 23:22:55.000000000 -0800 @@ -38,127 +38,133 @@ #include "iSeries_IoMmTable.h" #include "pci.h" -/*******************************************************************/ -/* Table defines */ -/* Each Entry size is 4 MB * 1024 Entries = 4GB I/O address space. */ -/*******************************************************************/ +/* + * Table defines + * Each Entry size is 4 MB * 1024 Entries = 4GB I/O address space. + */ #define Max_Entries 1024 unsigned long iSeries_IoMmTable_Entry_Size = 0x0000000000400000; unsigned long iSeries_Base_Io_Memory = 0xE000000000000000; unsigned long iSeries_Max_Io_Memory = 0xE000000000000000; static long iSeries_CurrentIndex = 0; -/*******************************************************************/ -/* Lookup Tables. */ -/*******************************************************************/ -struct iSeries_Device_Node** iSeries_IoMmTable; -u8* iSeries_IoBarTable; - -/*******************************************************************/ -/* Static and Global variables */ -/*******************************************************************/ -static char* iSeriesPciIoText = "iSeries PCI I/O"; +/* + * Lookup Tables. + */ +struct iSeries_Device_Node **iSeries_IoMmTable; +u8 *iSeries_IoBarTable; + +/* + * Static and Global variables + */ +static char *iSeriesPciIoText = "iSeries PCI I/O"; static spinlock_t iSeriesIoMmTableLock = SPIN_LOCK_UNLOCKED; -/*******************************************************************/ -/* iSeries_IoMmTable_Initialize */ -/*******************************************************************/ -/* Allocates and initalizes the Address Translation Table and Bar */ -/* Tables to get them ready for use. Must be called before any */ -/* I/O space is handed out to the device BARs. */ -/* A follow up method,iSeries_IoMmTable_Status can be called to */ -/* adjust the table after the device BARs have been assiged to */ -/* resize the table. */ -/*******************************************************************/ +/* + * iSeries_IoMmTable_Initialize + * + * Allocates and initalizes the Address Translation Table and Bar + * Tables to get them ready for use. Must be called before any + * I/O space is handed out to the device BARs. + * A follow up method,iSeries_IoMmTable_Status can be called to + * adjust the table after the device BARs have been assiged to + * resize the table. + */ void iSeries_IoMmTable_Initialize(void) { spin_lock(&iSeriesIoMmTableLock); - iSeries_IoMmTable = kmalloc(sizeof(void*)*Max_Entries,GFP_KERNEL); - iSeries_IoBarTable = kmalloc(sizeof(u8)*Max_Entries, GFP_KERNEL); + iSeries_IoMmTable = kmalloc(sizeof(void *) * Max_Entries, GFP_KERNEL); + iSeries_IoBarTable = kmalloc(sizeof(u8) * Max_Entries, GFP_KERNEL); spin_unlock(&iSeriesIoMmTableLock); - PCIFR("IoMmTable Initialized 0x%p", iSeries_IoMmTable); - if(iSeries_IoMmTable == NULL || iSeries_IoBarTable == NULL) { + PCIFR("IoMmTable Initialized 0x%p", iSeries_IoMmTable); + if ((iSeries_IoMmTable == NULL) || (iSeries_IoBarTable == NULL)) panic("PCI: I/O tables allocation failed.\n"); - } } -/*******************************************************************/ -/* iSeries_IoMmTable_AllocateEntry */ -/*******************************************************************/ -/* Adds pci_dev entry in address translation table */ -/*******************************************************************/ -/* - Allocates the number of entries required in table base on BAR */ -/* size. */ -/* - Allocates starting at iSeries_Base_Io_Memory and increases. */ -/* - The size is round up to be a multiple of entry size. */ -/* - CurrentIndex is incremented to keep track of the last entry. */ -/* - Builds the resource entry for allocated BARs. */ -/*******************************************************************/ -static void iSeries_IoMmTable_AllocateEntry(struct pci_dev* PciDev, int BarNumber) +/* + * iSeries_IoMmTable_AllocateEntry + * + * Adds pci_dev entry in address translation table + * + * - Allocates the number of entries required in table base on BAR + * size. + * - Allocates starting at iSeries_Base_Io_Memory and increases. + * - The size is round up to be a multiple of entry size. + * - CurrentIndex is incremented to keep track of the last entry. + * - Builds the resource entry for allocated BARs. + */ +static void iSeries_IoMmTable_AllocateEntry(struct pci_dev *PciDev, + int BarNumber) { - struct resource* BarResource = &PciDev->resource[BarNumber]; - long BarSize = pci_resource_len(PciDev,BarNumber); - /***********************************************************/ - /* No space to allocate, quick exit, skip Allocation. */ - /***********************************************************/ - if(BarSize == 0) return; - /***********************************************************/ - /* Set Resource values. */ - /***********************************************************/ + struct resource *BarResource = &PciDev->resource[BarNumber]; + long BarSize = pci_resource_len(PciDev, BarNumber); + + /* + * No space to allocate, quick exit, skip Allocation. + */ + if (BarSize == 0) + return; + /* + * Set Resource values. + */ spin_lock(&iSeriesIoMmTableLock); - BarResource->name = iSeriesPciIoText; - BarResource->start = iSeries_IoMmTable_Entry_Size*iSeries_CurrentIndex; - BarResource->start+= iSeries_Base_Io_Memory; - BarResource->end = BarResource->start+BarSize-1; - /***********************************************************/ - /* Allocate the number of table entries needed for BAR. */ - /***********************************************************/ + BarResource->name = iSeriesPciIoText; + BarResource->start = + iSeries_IoMmTable_Entry_Size * iSeries_CurrentIndex; + BarResource->start += iSeries_Base_Io_Memory; + BarResource->end = BarResource->start+BarSize-1; + /* + * Allocate the number of table entries needed for BAR. + */ while (BarSize > 0 ) { - *(iSeries_IoMmTable +iSeries_CurrentIndex) = (struct iSeries_Device_Node*)PciDev->sysdata; - *(iSeries_IoBarTable+iSeries_CurrentIndex) = BarNumber; + *(iSeries_IoMmTable + iSeries_CurrentIndex) = + (struct iSeries_Device_Node *)PciDev->sysdata; + *(iSeries_IoBarTable + iSeries_CurrentIndex) = BarNumber; BarSize -= iSeries_IoMmTable_Entry_Size; ++iSeries_CurrentIndex; } - iSeries_Max_Io_Memory = (iSeries_IoMmTable_Entry_Size*iSeries_CurrentIndex)+iSeries_Base_Io_Memory; + iSeries_Max_Io_Memory = iSeries_Base_Io_Memory + + (iSeries_IoMmTable_Entry_Size * iSeries_CurrentIndex); spin_unlock(&iSeriesIoMmTableLock); } -/*******************************************************************/ -/* iSeries_allocateDeviceBars */ -/*******************************************************************/ -/* - Allocates ALL pci_dev BAR's and updates the resources with the*/ -/* BAR value. BARS with zero length will have the resources */ -/* The HvCallPci_getBarParms is used to get the size of the BAR */ -/* space. It calls iSeries_IoMmTable_AllocateEntry to allocate */ -/* each entry. */ -/* - Loops through The Bar resources(0 - 5) including the ROM */ -/* is resource(6). */ -/*******************************************************************/ -void iSeries_allocateDeviceBars(struct pci_dev* PciDev) +/* + * iSeries_allocateDeviceBars + * + * - Allocates ALL pci_dev BAR's and updates the resources with the + * BAR value. BARS with zero length will have the resources + * The HvCallPci_getBarParms is used to get the size of the BAR + * space. It calls iSeries_IoMmTable_AllocateEntry to allocate + * each entry. + * - Loops through The Bar resources(0 - 5) including the ROM + * is resource(6). + */ +void iSeries_allocateDeviceBars(struct pci_dev *PciDev) { - struct resource* BarResource; - int BarNumber; - for(BarNumber = 0; BarNumber <= PCI_ROM_RESOURCE; ++BarNumber) { + struct resource *BarResource; + int BarNumber; + + for (BarNumber = 0; BarNumber <= PCI_ROM_RESOURCE; ++BarNumber) { BarResource = &PciDev->resource[BarNumber]; iSeries_IoMmTable_AllocateEntry(PciDev, BarNumber); } } -/************************************************************************/ -/* Translates the IoAddress to the device that is mapped to IoSpace. */ -/* This code is inlined, see the iSeries_pci.c file for the replacement.*/ -/************************************************************************/ -struct iSeries_Device_Node* iSeries_xlateIoMmAddress(void* IoAddress) +/* + * Translates the IoAddress to the device that is mapped to IoSpace. + * This code is inlined, see the iSeries_pci.c file for the replacement. + */ +struct iSeries_Device_Node *iSeries_xlateIoMmAddress(void *IoAddress) { return NULL; } -/************************************************************************ +/* * Status hook for IoMmTable - ************************************************************************/ -void iSeries_IoMmTable_Status(void) + */ +void iSeries_IoMmTable_Status(void) { - PCIFR("IoMmTable......: 0x%p",iSeries_IoMmTable); - PCIFR("IoMmTable Range: 0x%p to 0x%p",iSeries_Base_Io_Memory,iSeries_Max_Io_Memory); - return; + PCIFR("IoMmTable......: 0x%p", iSeries_IoMmTable); + PCIFR("IoMmTable Range: 0x%p to 0x%p", iSeries_Base_Io_Memory, + iSeries_Max_Io_Memory); } diff -puN arch/ppc64/kernel/iSeries_IoMmTable.h~ppc64-iseries_cleanup_2 arch/ppc64/kernel/iSeries_IoMmTable.h --- 25/arch/ppc64/kernel/iSeries_IoMmTable.h~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/iSeries_IoMmTable.h 2004-01-13 23:22:55.000000000 -0800 @@ -31,55 +31,55 @@ struct pci_dev; struct iSeries_Device_Node; -extern struct iSeries_Device_Node** iSeries_IoMmTable; -extern u8* iSeries_IoBarTable; +extern struct iSeries_Device_Node **iSeries_IoMmTable; +extern u8 *iSeries_IoBarTable; extern unsigned long iSeries_Base_Io_Memory; extern unsigned long iSeries_Max_Io_Memory; extern unsigned long iSeries_Base_Io_Memory; extern unsigned long iSeries_IoMmTable_Entry_Size; -/************************************************************************/ -/* iSeries_IoMmTable_Initialize */ -/************************************************************************/ -/* - Initalizes the Address Translation Table and get it ready for use. */ -/* Must be called before any client calls any of the other methods. */ -/* */ -/* Parameters: None. */ -/* */ -/* Return: None. */ -/************************************************************************/ -extern void iSeries_IoMmTable_Initialize(void); -extern void iSeries_IoMmTable_Status(void); +/* + * iSeries_IoMmTable_Initialize + * + * - Initalizes the Address Translation Table and get it ready for use. + * Must be called before any client calls any of the other methods. + * + * Parameters: None. + * + * Return: None. + */ +extern void iSeries_IoMmTable_Initialize(void); +extern void iSeries_IoMmTable_Status(void); -/************************************************************************/ -/* iSeries_allocateDeviceBars */ -/************************************************************************/ -/* - Allocates ALL pci_dev BAR's and updates the resources with the BAR */ -/* value. BARS with zero length will not have the resources. The */ -/* HvCallPci_getBarParms is used to get the size of the BAR space. */ -/* It calls iSeries_IoMmTable_AllocateEntry to allocate each entry. */ -/* */ -/* Parameters: */ -/* pci_dev = Pointer to pci_dev structure that will be mapped to pseudo */ -/* I/O Address. */ -/* */ -/* Return: */ -/* The pci_dev I/O resources updated with pseudo I/O Addresses. */ -/************************************************************************/ -extern void iSeries_allocateDeviceBars(struct pci_dev* ); +/* + * iSeries_allocateDeviceBars + * + * - Allocates ALL pci_dev BAR's and updates the resources with the BAR + * value. BARS with zero length will not have the resources. The + * HvCallPci_getBarParms is used to get the size of the BAR space. + * It calls iSeries_IoMmTable_AllocateEntry to allocate each entry. + * + * Parameters: + * pci_dev = Pointer to pci_dev structure that will be mapped to pseudo + * I/O Address. + * + * Return: + * The pci_dev I/O resources updated with pseudo I/O Addresses. + */ +extern void iSeries_allocateDeviceBars(struct pci_dev *); -/************************************************************************/ -/* iSeries_xlateIoMmAddress */ -/************************************************************************/ -/* - Translates an I/O Memory address to Device Node that has been the */ -/* allocated the psuedo I/O Address. */ -/* */ -/* Parameters: */ -/* IoAddress = I/O Memory Address. */ -/* */ -/* Return: */ -/* An iSeries_Device_Node to the device mapped to the I/O address. The*/ -/* BarNumber and BarOffset are valid if the Device Node is returned. */ -/************************************************************************/ -extern struct iSeries_Device_Node* iSeries_xlateIoMmAddress(void* IoAddress); +/* + * iSeries_xlateIoMmAddress + * + * - Translates an I/O Memory address to Device Node that has been the + * allocated the psuedo I/O Address. + * + * Parameters: + * IoAddress = I/O Memory Address. + * + * Return: + * An iSeries_Device_Node to the device mapped to the I/O address. The + * BarNumber and BarOffset are valid if the Device Node is returned. + */ +extern struct iSeries_Device_Node *iSeries_xlateIoMmAddress(void *IoAddress); #endif /* _ISERIES_IOMMTABLE_H */ diff -puN arch/ppc64/kernel/iSeries_VpdInfo.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/iSeries_VpdInfo.c --- 25/arch/ppc64/kernel/iSeries_VpdInfo.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/iSeries_VpdInfo.c 2004-01-13 23:22:55.000000000 -0800 @@ -38,20 +38,20 @@ #include #include "pci.h" -/************************************************/ -/* Size of Bus VPD data */ -/************************************************/ +/* + * Size of Bus VPD data + */ #define BUS_VPDSIZE 1024 -/************************************************/ -/* Bus Vpd Tags */ -/************************************************/ +/* + * Bus Vpd Tags + */ #define VpdEndOfDataTag 0x78 #define VpdEndOfAreaTag 0x79 #define VpdIdStringTag 0x82 #define VpdVendorAreaTag 0x84 -/************************************************/ -/* Mfg Area Tags */ -/************************************************/ +/* + * Mfg Area Tags + */ #define VpdFruFlag 0x4647 // "FG" #define VpdFruFrameId 0x4649 // "FI" #define VpdSlotMapFormat 0x4D46 // "MF" @@ -59,9 +59,9 @@ #define VpdFruSerial 0x534E // "SN" #define VpdSlotMap 0x534D // "SM" -/************************************************/ -/* Structures of the areas */ -/************************************************/ +/* + * Structures of the areas + */ struct MfgVpdAreaStruct { u16 Tag; u8 TagLength; @@ -82,168 +82,172 @@ struct SlotMapStruct { typedef struct SlotMapStruct SlotMap; #define SLOT_ENTRY_SIZE 16 -/**************************************************************** - * * - * Bus, Card, Board, FrameId, CardLocation. * - ****************************************************************/ -LocationData* iSeries_GetLocationData(struct pci_dev* PciDev) +/* + * Bus, Card, Board, FrameId, CardLocation. + */ +LocationData* iSeries_GetLocationData(struct pci_dev *PciDev) { - struct iSeries_Device_Node* DevNode = (struct iSeries_Device_Node*)PciDev->sysdata; - LocationData* LocationPtr = (LocationData*)kmalloc(LOCATION_DATA_SIZE, GFP_KERNEL); + struct iSeries_Device_Node *DevNode = + (struct iSeries_Device_Node *)PciDev->sysdata; + LocationData *LocationPtr = + (LocationData *)kmalloc(LOCATION_DATA_SIZE, GFP_KERNEL); + if (LocationPtr == NULL) { printk("PCI: LocationData area allocation failed!\n"); return NULL; } - memset(LocationPtr,0,LOCATION_DATA_SIZE); - LocationPtr->Bus = ISERIES_BUS(DevNode); - LocationPtr->Board = DevNode->Board; - LocationPtr->FrameId = DevNode->FrameId; - LocationPtr->Card = PCI_SLOT(DevNode->DevFn); - strcpy(&LocationPtr->CardLocation[0],&DevNode->CardLocation[0]); + memset(LocationPtr, 0, LOCATION_DATA_SIZE); + LocationPtr->Bus = ISERIES_BUS(DevNode); + LocationPtr->Board = DevNode->Board; + LocationPtr->FrameId = DevNode->FrameId; + LocationPtr->Card = PCI_SLOT(DevNode->DevFn); + strcpy(&LocationPtr->CardLocation[0], &DevNode->CardLocation[0]); return LocationPtr; } -/************************************************************************/ -/* Formats the device information. */ -/* - Pass in pci_dev* pointer to the device. */ -/* - Pass in buffer to place the data. Danger here is the buffer must */ -/* be as big as the client says it is. Should be at least 128 bytes.*/ -/* Return will the length of the string data put in the buffer. */ -/* Format: */ -/* PCI: Bus 0, Device 26, Vendor 0x12AE Frame 1, Card C10 Ethernet */ -/* controller */ -/************************************************************************/ -int iSeries_Device_Information(struct pci_dev* PciDev,char* Buffer, int BufferSize) +/* + * Formats the device information. + * - Pass in pci_dev* pointer to the device. + * - Pass in buffer to place the data. Danger here is the buffer must + * be as big as the client says it is. Should be at least 128 bytes. + * Return will the length of the string data put in the buffer. + * Format: + * PCI: Bus 0, Device 26, Vendor 0x12AE Frame 1, Card C10 Ethernet + * controller + */ +int iSeries_Device_Information(struct pci_dev *PciDev, char *buffer, + int BufferSize) { - struct iSeries_Device_Node* DevNode = (struct iSeries_Device_Node*)PciDev->sysdata; - char* BufPtr = Buffer; - int LineLen = 0; - - if (DevNode == NULL) { - LineLen = sprintf(BufPtr+LineLen, "PCI: iSeries_Device_Information DevNode is NULL"); - return LineLen; - } - - if (BufferSize >= 128) { - LineLen = sprintf(BufPtr+LineLen,"PCI: Bus%3d, Device%3d, Vendor %04X ", - ISERIES_BUS(DevNode), PCI_SLOT(PciDev->devfn),PciDev->vendor); - - LineLen += sprintf(BufPtr+LineLen,"Frame%3d, Card %4s ", DevNode->FrameId,DevNode->CardLocation); - - if (pci_class_name(PciDev->class >> 8) == 0) { - LineLen += sprintf(BufPtr+LineLen,"0x%04X ",(int)(PciDev->class >> 8)); - } - else { - LineLen += sprintf(BufPtr+LineLen,"%s",pci_class_name(PciDev->class >> 8) ); - } - } - return LineLen; + struct iSeries_Device_Node *DevNode = + (struct iSeries_Device_Node *)PciDev->sysdata; + int len; + + if (DevNode == NULL) + return sprintf(buffer, + "PCI: iSeries_Device_Information DevNode is NULL"); + + if (BufferSize < 128) + return 0; + + len = sprintf(buffer, "PCI: Bus%3d, Device%3d, Vendor %04X ", + ISERIES_BUS(DevNode), PCI_SLOT(PciDev->devfn), + PciDev->vendor); + len += sprintf(buffer + len, "Frame%3d, Card %4s ", + DevNode->FrameId, DevNode->CardLocation); +#ifdef CONFIG_PCI + if (pci_class_name(PciDev->class >> 8) == 0) + len += sprintf(buffer + len, "0x%04X ", + (int)(PciDev->class >> 8)); + else + len += sprintf(buffer + len, "%s", + pci_class_name(PciDev->class >> 8)); +#endif + return len; } -/************************************************************************/ -/* Build a character string of the device location, Frame 1, Card C10 */ -/************************************************************************/ -int device_Location(struct pci_dev* PciDev,char* BufPtr) + +/* + * Build a character string of the device location, Frame 1, Card C10 + */ +int device_Location(struct pci_dev *PciDev, char *BufPtr) { - struct iSeries_Device_Node* DevNode = (struct iSeries_Device_Node*)PciDev->sysdata; - return sprintf(BufPtr,"PCI: Bus%3d, AgentId%3d, Vendor %04X, Location %s", - DevNode->DsaAddr.busNumber, - DevNode->AgentId, - DevNode->Vendor, - DevNode->Location); + struct iSeries_Device_Node *DevNode = + (struct iSeries_Device_Node *)PciDev->sysdata; + return sprintf(BufPtr, "PCI: Bus%3d, AgentId%3d, Vendor %04X, Location %s", + DevNode->DsaAddr.busNumber, DevNode->AgentId, + DevNode->Vendor, DevNode->Location); } -/*****************************************************************/ -/* Parse the Slot Area */ -/*****************************************************************/ -void iSeries_Parse_SlotArea(SlotMap* MapPtr,int MapLen, struct iSeries_Device_Node* DevNode) +/* + * Parse the Slot Area + */ +void iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen, + struct iSeries_Device_Node *DevNode) { - int SlotMapLen = MapLen; - SlotMap* SlotMapPtr = MapPtr; - /*************************************************************/ - /* Parse Slot label until we find the one requrested */ - /*************************************************************/ + int SlotMapLen = MapLen; + SlotMap *SlotMapPtr = MapPtr; + + /* + * Parse Slot label until we find the one requrested + */ while (SlotMapLen > 0) { if (SlotMapPtr->AgentId == DevNode->AgentId ) { - /*******************************************************/ - /* If Phb wasn't found, grab the entry first one found.*/ - /*******************************************************/ - if (DevNode->PhbId == 0xff) { + /* + * If Phb wasn't found, grab the entry first one found. + */ + if (DevNode->PhbId == 0xff) DevNode->PhbId = SlotMapPtr->PhbId; - } - /**************************************************/ - /* Found it, extract the data. */ - /**************************************************/ + /* Found it, extract the data. */ if (SlotMapPtr->PhbId == DevNode->PhbId ) { - memcpy(&DevNode->CardLocation,&SlotMapPtr->CardLocation,3); + memcpy(&DevNode->CardLocation, + &SlotMapPtr->CardLocation, 3); DevNode->CardLocation[3] = 0; break; } } - /*********************************************************/ - /* Point to the next Slot */ - /*********************************************************/ - SlotMapPtr = (SlotMap*)((char*)SlotMapPtr+SLOT_ENTRY_SIZE); + /* Point to the next Slot */ + SlotMapPtr = (SlotMap *)((char *)SlotMapPtr + SLOT_ENTRY_SIZE); SlotMapLen -= SLOT_ENTRY_SIZE; } } -/*****************************************************************/ -/* Parse the Mfg Area */ -/*****************************************************************/ -static void iSeries_Parse_MfgArea(u8* AreaData,int AreaLen, struct iSeries_Device_Node* DevNode) +/* + * Parse the Mfg Area + */ +static void iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen, + struct iSeries_Device_Node *DevNode) { - MfgArea* MfgAreaPtr = (MfgArea*)AreaData; - int MfgAreaLen = AreaLen; - u16 SlotMapFmt = 0; - - /*************************************************************/ - /* Parse Mfg Data */ - /*************************************************************/ + MfgArea *MfgAreaPtr = (MfgArea *)AreaData; + int MfgAreaLen = AreaLen; + u16 SlotMapFmt = 0; + + /* Parse Mfg Data */ while (MfgAreaLen > 0) { - int MfgTagLen = MfgAreaPtr->TagLength; - /*******************************************************/ - /* Frame ID (FI 4649020310 ) */ - /*******************************************************/ - if (MfgAreaPtr->Tag == VpdFruFrameId) { /* FI */ + int MfgTagLen = MfgAreaPtr->TagLength; + /* Frame ID (FI 4649020310 ) */ + if (MfgAreaPtr->Tag == VpdFruFrameId) /* FI */ DevNode->FrameId = MfgAreaPtr->AreaData1; + /* Slot Map Format (MF 4D46020004 ) */ + else if (MfgAreaPtr->Tag == VpdSlotMapFormat) /* MF */ + SlotMapFmt = (MfgAreaPtr->AreaData1 * 256) + + MfgAreaPtr->AreaData2; + /* Slot Map (SM 534D90 */ + else if (MfgAreaPtr->Tag == VpdSlotMap) { /* SM */ + SlotMap *SlotMapPtr; + + if (SlotMapFmt == 0x1004) + SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr + + MFG_ENTRY_SIZE + 1); + else + SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr + + MFG_ENTRY_SIZE); + iSeries_Parse_SlotArea(SlotMapPtr, MfgTagLen, DevNode); } - /*******************************************************/ - /* Slot Map Format (MF 4D46020004 ) */ - /*******************************************************/ - else if (MfgAreaPtr->Tag == VpdSlotMapFormat){ /* MF */ - SlotMapFmt = (MfgAreaPtr->AreaData1*256)+(MfgAreaPtr->AreaData2); - } - /*******************************************************/ - /* Slot Map (SM 534D90 */ - /*******************************************************/ - else if (MfgAreaPtr->Tag == VpdSlotMap){ /* SM */ - SlotMap* SlotMapPtr; - if (SlotMapFmt == 0x1004) SlotMapPtr = (SlotMap*)((char*)MfgAreaPtr+MFG_ENTRY_SIZE+1); - else SlotMapPtr = (SlotMap*)((char*)MfgAreaPtr+MFG_ENTRY_SIZE); - iSeries_Parse_SlotArea(SlotMapPtr,MfgTagLen, DevNode); - } - /*********************************************************/ - /* Point to the next Mfg Area */ - /* Use defined size, sizeof give wrong answer */ - /*********************************************************/ - MfgAreaPtr = (MfgArea*)((char*)MfgAreaPtr + MfgTagLen + MFG_ENTRY_SIZE); + /* + * Point to the next Mfg Area + * Use defined size, sizeof give wrong answer + */ + MfgAreaPtr = (MfgArea *)((char *)MfgAreaPtr + MfgTagLen + + MFG_ENTRY_SIZE); MfgAreaLen -= (MfgTagLen + MFG_ENTRY_SIZE); } } -/*****************************************************************/ -/* Look for "BUS".. Data is not Null terminated. */ -/* PHBID of 0xFF indicates PHB was not found in VPD Data. */ -/*****************************************************************/ -static int iSeries_Parse_PhbId(u8* AreaPtr,int AreaLength) +/* + * Look for "BUS".. Data is not Null terminated. + * PHBID of 0xFF indicates PHB was not found in VPD Data. + */ +static int iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength) { - u8* PhbPtr = AreaPtr; - int DataLen = AreaLength; - char PhbId = 0xFF; + u8 *PhbPtr = AreaPtr; + int DataLen = AreaLength; + char PhbId = 0xFF; + while (DataLen > 0) { - if (*PhbPtr == 'B' && *(PhbPtr+1) == 'U' && *(PhbPtr+2) == 'S') { + if ((*PhbPtr == 'B') && (*(PhbPtr + 1) == 'U') + && (*(PhbPtr + 2) == 'S')) { PhbPtr += 3; - while(*PhbPtr == ' ') ++PhbPtr; + while (*PhbPtr == ' ') + ++PhbPtr; PhbId = (*PhbPtr & 0x0F); break; } @@ -253,64 +257,54 @@ static int iSeries_Parse_PhbId(u8* AreaP return PhbId; } -/****************************************************************/ -/* Parse out the VPD Areas */ -/****************************************************************/ -static void iSeries_Parse_Vpd(u8* VpdData, int VpdDataLen, struct iSeries_Device_Node* DevNode) +/* + * Parse out the VPD Areas + */ +static void iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen, + struct iSeries_Device_Node *DevNode) { - u8* TagPtr = VpdData; - int DataLen = VpdDataLen-3; - /*************************************************************/ - /* Parse the Areas */ - /*************************************************************/ - while (*TagPtr != VpdEndOfAreaTag && DataLen > 0) { - int AreaLen = *(TagPtr+1) + (*(TagPtr+2)*256); - u8* AreaData = TagPtr+3; + u8 *TagPtr = VpdData; + int DataLen = VpdDataLen - 3; - if (*TagPtr == VpdIdStringTag) { - DevNode->PhbId = iSeries_Parse_PhbId(AreaData,AreaLen); - } - else if (*TagPtr == VpdVendorAreaTag) { - iSeries_Parse_MfgArea(AreaData,AreaLen,DevNode); - } - /********************************************************* - * Point to next Area. - *********************************************************/ + while ((*TagPtr != VpdEndOfAreaTag) && (DataLen > 0)) { + int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256); + u8 *AreaData = TagPtr + 3; + + if (*TagPtr == VpdIdStringTag) + DevNode->PhbId = iSeries_Parse_PhbId(AreaData, AreaLen); + else if (*TagPtr == VpdVendorAreaTag) + iSeries_Parse_MfgArea(AreaData, AreaLen, DevNode); + /* Point to next Area. */ TagPtr = AreaData + AreaLen; DataLen -= AreaLen; } } -/**************************************************************** - * iSeries_Get_Location_Code(struct iSeries_Device_Node*) * - * - ****************************************************************/ -void iSeries_Get_Location_Code(struct iSeries_Device_Node* DevNode) +void iSeries_Get_Location_Code(struct iSeries_Device_Node *DevNode) { - int BusVpdLen = 0; - u8* BusVpdPtr = (u8*)kmalloc(BUS_VPDSIZE, GFP_KERNEL); + int BusVpdLen = 0; + u8 *BusVpdPtr = (u8 *)kmalloc(BUS_VPDSIZE, GFP_KERNEL); + if (BusVpdPtr == NULL) { printk("PCI: Bus VPD Buffer allocation failure.\n"); return; } - BusVpdLen = HvCallPci_getBusVpd(ISERIES_BUS(DevNode),REALADDR(BusVpdPtr),BUS_VPDSIZE); + BusVpdLen = HvCallPci_getBusVpd(ISERIES_BUS(DevNode), + REALADDR(BusVpdPtr), BUS_VPDSIZE); if (BusVpdLen == 0) { kfree(BusVpdPtr); printk("PCI: Bus VPD Buffer zero length.\n"); return; } - //printk("PCI: BusVpdPtr: %p, %d\n",BusVpdPtr, BusVpdLen); - /*************************************************************/ - /* Make sure this is what I think it is */ - /*************************************************************/ - if (*BusVpdPtr != VpdIdStringTag) { /*0x82 */ + /* printk("PCI: BusVpdPtr: %p, %d\n",BusVpdPtr, BusVpdLen); */ + /* Make sure this is what I think it is */ + if (*BusVpdPtr != VpdIdStringTag) { /* 0x82 */ printk("PCI: Bus VPD Buffer missing starting tag.\n"); kfree(BusVpdPtr); return; } - /***************************************************************/ - /***************************************************************/ iSeries_Parse_Vpd(BusVpdPtr,BusVpdLen, DevNode); - sprintf(DevNode->Location,"Frame%3d, Card %-4s",DevNode->FrameId,DevNode->CardLocation); + sprintf(DevNode->Location, "Frame%3d, Card %-4s", DevNode->FrameId, + DevNode->CardLocation); kfree(BusVpdPtr); } diff -puN arch/ppc64/kernel/iSeries_pci_reset.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/iSeries_pci_reset.c --- 25/arch/ppc64/kernel/iSeries_pci_reset.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/iSeries_pci_reset.c 2004-01-13 23:22:55.000000000 -0800 @@ -42,47 +42,62 @@ #include #include "pci.h" -/************************************************************************/ -/* Interface to toggle the reset line */ -/* Time is in .1 seconds, need for seconds. */ -/************************************************************************/ -int iSeries_Device_ToggleReset(struct pci_dev* PciDev, int AssertTime, int DelayTime) +/* + * Interface to toggle the reset line + * Time is in .1 seconds, need for seconds. + */ +int iSeries_Device_ToggleReset(struct pci_dev *PciDev, int AssertTime, + int DelayTime) { unsigned long AssertDelay, WaitDelay; - struct iSeries_Device_Node* DeviceNode = (struct iSeries_Device_Node*)PciDev->sysdata; + struct iSeries_Device_Node *DeviceNode = + (struct iSeries_Device_Node *)PciDev->sysdata; + if (DeviceNode == NULL) { - printk("PCI: Pci Reset Failed, Device Node not found for pci_dev %p\n",PciDev); + printk("PCI: Pci Reset Failed, Device Node not found for pci_dev %p\n", + PciDev); return -1; } - /******************************************************************** + /* * Set defaults, Assert is .5 second, Wait is 3 seconds. - ********************************************************************/ - if (AssertTime == 0) AssertDelay = ( 5 * HZ)/10; - else AssertDelay = (AssertTime*HZ)/10; - if (WaitDelay == 0) WaitDelay = (30 * HZ)/10; - else WaitDelay = (DelayTime* HZ)/10; + */ + if (AssertTime == 0) + AssertDelay = (5 * HZ) / 10; + else + AssertDelay = (AssertTime * HZ) / 10; + if (WaitDelay == 0) + WaitDelay = (30 * HZ) / 10; + else + WaitDelay = (DelayTime * HZ) / 10; - /******************************************************************** + /* * Assert reset - ********************************************************************/ - DeviceNode->ReturnCode = HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode),0x00,DeviceNode->AgentId,1); + */ + DeviceNode->ReturnCode = HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode), + 0x00, DeviceNode->AgentId, 1); if (DeviceNode->ReturnCode == 0) { set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(AssertDelay); /* Sleep for the time */ - DeviceNode->ReturnCode = HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode),0x00,DeviceNode->AgentId, 0); + schedule_timeout(AssertDelay); /* Sleep for the time */ + DeviceNode->ReturnCode = + HvCallPci_setSlotReset(ISERIES_BUS(DeviceNode), + 0x00, DeviceNode->AgentId, 0); - /*************************************************************** + /* * Wait for device to reset - ***************************************************************/ + */ set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(WaitDelay); } - if (DeviceNode->ReturnCode == 0) { - PCIFR("Slot 0x%04X.%02 Reset\n",ISERIES_BUS(DeviceNode),DeviceNode->AgentId ); - } + if (DeviceNode->ReturnCode == 0) + PCIFR("Slot 0x%04X.%02 Reset\n", ISERIES_BUS(DeviceNode), + DeviceNode->AgentId); else { - printk("PCI: Slot 0x%04X.%02X Reset Failed, RCode: %04X\n",ISERIES_BUS(DeviceNode),DeviceNode->AgentId,DeviceNode->ReturnCode); - PCIFR( "Slot 0x%04X.%02X Reset Failed, RCode: %04X\n",ISERIES_BUS(DeviceNode),DeviceNode->AgentId,DeviceNode->ReturnCode); + printk("PCI: Slot 0x%04X.%02X Reset Failed, RCode: %04X\n", + ISERIES_BUS(DeviceNode), DeviceNode->AgentId, + DeviceNode->ReturnCode); + PCIFR("Slot 0x%04X.%02X Reset Failed, RCode: %04X\n", + ISERIES_BUS(DeviceNode), DeviceNode->AgentId, + DeviceNode->ReturnCode); } return DeviceNode->ReturnCode; } diff -puN arch/ppc64/kernel/iSeries_proc.c~ppc64-iseries_cleanup_2 arch/ppc64/kernel/iSeries_proc.c --- 25/arch/ppc64/kernel/iSeries_proc.c~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/iSeries_proc.c 2004-01-13 23:22:55.000000000 -0800 @@ -16,29 +16,22 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - - -/* Change Activity: */ -/* End Change Activity */ - #include #include -#ifndef _ISERIES_PROC_H +#include #include -#endif static struct proc_dir_entry *iSeries_proc_root; static int iSeries_proc_initializationDone; static spinlock_t iSeries_proc_lock; -struct iSeries_proc_registration -{ +struct iSeries_proc_registration { struct iSeries_proc_registration *next; iSeriesProcFunction functionMember; }; - struct iSeries_proc_registration preallocated[16]; + #define MYQUEUETYPE(T) struct MYQueue##T #define MYQUEUE(T) \ MYQUEUETYPE(T) \ @@ -68,33 +61,33 @@ do { \ if ((q)->tail == NULL) \ (q)->head = NULL; \ } while(0) + MYQUEUE(iSeries_proc_registration); typedef MYQUEUETYPE(iSeries_proc_registration) aQueue; - -aQueue iSeries_free; -aQueue iSeries_queued; +static aQueue iSeries_free; +static aQueue iSeries_queued; void iSeries_proc_early_init(void) { int i = 0; unsigned long flags; + iSeries_proc_initializationDone = 0; spin_lock_init(&iSeries_proc_lock); MYQUEUECTOR(&iSeries_free); MYQUEUECTOR(&iSeries_queued); spin_lock_irqsave(&iSeries_proc_lock, flags); - for (i = 0; i < 16; ++i) { - MYQUEUEENQ(&iSeries_free, preallocated+i); - } + for (i = 0; i < 16; ++i) + MYQUEUEENQ(&iSeries_free, preallocated + i); spin_unlock_irqrestore(&iSeries_proc_lock, flags); } -void iSeries_proc_create(void) +static int iSeries_proc_create(void) { unsigned long flags; - struct iSeries_proc_registration *reg = NULL; + struct iSeries_proc_registration *reg; printk("iSeries_proc: Creating /proc/iSeries\n"); @@ -112,31 +105,27 @@ void iSeries_proc_create(void) iSeries_proc_initializationDone = 1; out: spin_unlock_irqrestore(&iSeries_proc_lock, flags); + return 0; } +arch_initcall(iSeries_proc_create); + void iSeries_proc_callback(iSeriesProcFunction initFunction) { unsigned long flags; - spin_lock_irqsave(&iSeries_proc_lock, flags); - if (iSeries_proc_initializationDone) { + spin_lock_irqsave(&iSeries_proc_lock, flags); + if (iSeries_proc_initializationDone) (*initFunction)(iSeries_proc_root); - } else { + else { struct iSeries_proc_registration *reg = NULL; MYQUEUEDEQ(&iSeries_free, reg); - if (reg != NULL) { - /* printk("Registering %p in reg %p\n", initFunction, reg); */ reg->functionMember = initFunction; - MYQUEUEENQ(&iSeries_queued, reg); - } else { + } else printk("Couldn't get a queue entry\n"); - } } - spin_unlock_irqrestore(&iSeries_proc_lock, flags); } - - diff -puN include/asm-ppc64/iSeries/iSeries_proc.h~ppc64-iseries_cleanup_2 include/asm-ppc64/iSeries/iSeries_proc.h --- 25/include/asm-ppc64/iSeries/iSeries_proc.h~ppc64-iseries_cleanup_2 2004-01-13 23:22:55.000000000 -0800 +++ 25-akpm/include/asm-ppc64/iSeries/iSeries_proc.h 2004-01-13 23:22:55.000000000 -0800 @@ -16,22 +16,15 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - - -/* Change Activity: */ -/* End Change Activity */ - #ifndef _ISERIES_PROC_H #define _ISERIES_PROC_H #include extern void iSeries_proc_early_init(void); -extern void iSeries_proc_create(void); typedef void (*iSeriesProcFunction)(struct proc_dir_entry *iSeries_proc); extern void iSeries_proc_callback(iSeriesProcFunction initFunction); #endif /* _iSeries_PROC_H */ - _