Changeset 421
- Timestamp:
- Mar 23, 2009, 9:13:00 AM (16 years ago)
- Location:
- GPL/branches/uniaud32-2.0
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-2.0/drv32/irq.cpp
r375 r421 47 47 48 48 //****************************************************************************** 49 #ifdef ACPI 50 //PS+++ fix description 51 // Problem is in open high IRQ (acpi.psd /SMP /APIC) at boot time. 52 // In my case - this IRQ use SATA and we have flood IRQ. This flood do 53 // MASK this IRQ from kernel. Next danis506.add has very slow read from 54 // disk. 55 // How to fix. 56 // At boot time (from DevInit to DevInitComplete) we use low IRQ. In 57 // DevInitComplete we close low IRQ and open high IRQ. All values for 58 // IRQ we are getting from ACPI call. 59 60 //PS+++ Array with saving IRQ number 61 #ifdef __cplusplus 62 extern "C" { 63 #endif 64 struct SaveIRQForSlot 65 { 66 ULONG ulSlotNo; 67 BYTE LowIRQ; 68 BYTE HighIRQ; 69 BYTE Pin; 70 } sISRHigh[8]; //FIX me to MAX_DEVICES or same 71 72 int SaveIRQCounter = 0; //PS+++ current position in array 73 extern ULONG InitCompleteWas; //PS+++ Indication of InitComplete call 74 #ifdef __cplusplus 75 } 76 #endif 77 78 #endif //ACPI 49 79 //****************************************************************************** 50 80 BOOL ALSA_SetIrq(ULONG ulIrq, ULONG ulSlotNo, BOOL fShared) … … 65 95 66 96 if (rc != 0) { // If error ... 67 97 dprintf(("ERROR: RMSetIrq %d %d %x - failed to set shared - trying exclusive!!", ulIrq, fShared, ulSlotNo)); 68 98 rc = DevIRQSet((WORD16) *pISR[ulSlotNo], 69 99 (WORD16)ulIrq, … … 76 106 return FALSE; 77 107 } 108 //PS+++ Begin 109 #ifdef ACPI 110 if (InitCompleteWas == 0) 111 { 112 dprintf(("RMSetIrq saved %d %d %x was %d", (ULONG)ulIrq, ulSlotNo,(ULONG)sISRHigh[SaveIRQCounter].LowIRQ)); 113 sISRHigh[SaveIRQCounter].ulSlotNo = ulSlotNo; 114 SaveIRQCounter++; 115 return TRUE; 116 } 117 #endif 118 //PS End 78 119 79 120 return TRUE; -
GPL/branches/uniaud32-2.0/drv32/rmhelp.cpp
r352 r421 149 149 //****************************************************************************** 150 150 //****************************************************************************** 151 //PS+++ see to irq.cpp 152 #ifdef ACPI 153 #ifdef __cplusplus 154 extern "C" { 155 #endif 156 struct SaveIRQForSlot 157 { 158 ULONG ulSlotNo; 159 BYTE LowIRQ; 160 BYTE HighIRQ; 161 BYTE Pin; 162 }; 163 extern struct SaveIRQForSlot sISRHigh[]; 164 extern int SaveIRQCounter; 165 #ifdef __cplusplus 166 } 167 #endif 168 #endif 151 169 BOOL RMRequestIRQ(ULONG ulIrq, BOOL fShared) 152 170 { … … 156 174 157 175 Resource.ResourceType = RS_TYPE_IRQ; 176 #ifdef ACPI //PS+++ 177 Resource.IRQResource.PCIIrqPin = (USHORT)(sISRHigh[SaveIRQCounter].Pin & 0xf); 178 if (sISRHigh[SaveIRQCounter].HighIRQ) 179 Resource.IRQResource.IRQLevel = (USHORT)sISRHigh[SaveIRQCounter].HighIRQ & 0xff; 180 else 181 Resource.IRQResource.IRQLevel = (USHORT)ulIrq & 0xff; 182 #else 158 183 Resource.IRQResource.IRQLevel = (USHORT)ulIrq & 0xff; 184 Resource.IRQResource.PCIIrqPin = 0; 185 #endif 159 186 Resource.IRQResource.IRQFlags = ( fShared ) ? RS_IRQ_SHARED : RS_IRQ_EXCLUSIVE; 160 Resource.IRQResource.PCIIrqPin = (USHORT)( (ulIrq >> 8) & 0xf);161 187 162 188 rc = RMAllocResource(DriverHandle, // Handle to driver. -
GPL/branches/uniaud32-2.0/drv32/strategy.c
r84 r421 77 77 //****************************************************************************** 78 78 // External initialization complete entry-point 79 #ifdef ACPI 80 // See desription in irq.cpp 81 #include "irqos2.h" //PS+++ 82 #ifdef __cplusplus 83 extern "C" { 84 #endif 85 ULONG InitCompleteWas = 0; //PS+++ Indication of InitComplete call 86 struct SaveIRQForSlot 87 { 88 ULONG ulSlotNo; 89 BYTE LowIRQ; 90 BYTE HighIRQ; 91 BYTE Pin; 92 }; 93 extern struct SaveIRQForSlot sISRHigh[]; 94 extern int SaveIRQCounter; 95 #ifdef __cplusplus 96 } 97 #endif 98 #endif //ACPI 79 99 //****************************************************************************** 80 100 #pragma off (unreferenced) … … 82 102 #pragma on (unreferenced) 83 103 { 104 #ifdef ACPI 105 //PS+++ Begin 106 ULONG i, rc = 0; 107 108 InitCompleteWas = 1; 109 110 for (i = 0; i < SaveIRQCounter; i++) 111 { 112 dprintf(("Close IRQ%d - Open IRQ%d",(ULONG)sISRHigh[i].LowIRQ,(ULONG)sISRHigh[i].HighIRQ)); 113 if (sISRHigh[i].HighIRQ) 114 { 115 ALSA_FreeIrq(sISRHigh[i].LowIRQ); 116 if (!ALSA_SetIrq(sISRHigh[i].HighIRQ, sISRHigh[i].ulSlotNo, 1)) 117 { 118 return (RPERR_COMMAND | RPDONE); 119 } 120 } 121 } 122 #endif 123 //PS++ End 84 124 #ifdef DEBUG 85 125 dprintf(("StratInitComplete")); -
GPL/branches/uniaud32-2.0/lib32/debug.c
r420 r421 41 41 extern int max_buf_size; 42 42 43 #ifdef DEBUG44 short int MAGIC_COMM_PORT = 0x3f8; // pulled from word ptr 40:045 46 47 #define UART_DATA 0x00 // UART Data port48 #define UART_INT_ENAB 0x01 // UART Interrupt enable49 #define UART_INT_ID 0x02 // interrupt ID50 #define UART_LINE_CTRL 0x03 // line control registers51 #define UART_MODEM_CTRL 0x04 // modem control register52 #define UART_LINE_STAT 0x05 // line status register53 #define UART_MODEM_STAT 0x06 // modem status regiser54 #define UART_DIVISOR_LO 0x00 // divisor latch least sig55 #define UART_DIVISOR_HI 0x01h // divisor latch most sig56 57 #define DELAY nop58 #else59 short int MAGIC_COMM_PORT = 0x0; // pulled from word ptr 40:060 #endif61 62 43 char hextab[]="0123456789ABCDEF"; 63 44 … … 565 546 return psz - pszC; 566 547 } 548 //PS+++ Changes for right debug output 549 #ifdef DEBUG 550 short int MAGIC_COMM_PORT = 0; // pulled from word ptr 40:0 551 552 553 #define UART_DATA 0x00 // UART Data port 554 #define UART_INT_ENAB 0x01 // UART Interrupt enable 555 #define UART_INT_ID 0x02 // interrupt ID 556 #define UART_LINE_CTRL 0x03 // line control registers 557 #define UART_MODEM_CTRL 0x04 // modem control register 558 #define UART_LINE_STAT 0x05 // line status register 559 #define UART_MODEM_STAT 0x06 // modem status regiser 560 #define UART_DIVISOR_LO 0x00 // divisor latch least sig 561 #define UART_DIVISOR_HI 0x01h // divisor latch most sig 562 563 #define DELAY nop 564 #else 565 short int MAGIC_COMM_PORT = 0x0; // pulled from word ptr 40:0 566 #endif 567 567 568 568 void StringOut(char *DbgStr) … … 579 579 */ 580 580 #ifdef DEBUG 581 if (MAGIC_COMM_PORT) 581 if (MAGIC_COMM_PORT) //PS+++ If have comport - out to it 582 582 { 583 583 for( i= 0; i < len; i++ ) 584 CharOut( DbgStr[i] ); 584 CharOut( DbgStr[i] ); 585 585 586 if (fLineTerminate) 586 587 { … … 630 631 #endif 631 632 633 632 634 #ifdef DEBUG //--------------------------- CharOut - 633 635 void CharOut(char c) -
GPL/branches/uniaud32-2.0/lib32/pci.c
r410 r421 135 135 //****************************************************************************** 136 136 //****************************************************************************** 137 #ifdef ACPI 138 struct SaveIRQForSlot 139 { 140 ULONG ulSlotNo; 141 BYTE LowIRQ; 142 BYTE HighIRQ; 143 BYTE Pin; 144 }; 145 extern struct SaveIRQForSlot sISRHigh[]; 146 extern int SaveIRQCounter; 147 #endif 148 137 149 static int pci_query_device(unsigned int vendor, unsigned int device, 138 150 struct pci_dev near *pcidev, int idx) … … 230 242 // IRQ and PIN 231 243 pci_read_config_dword(pcidev, PCI_INTERRUPT_LINE, &temp); 244 sISRHigh[SaveIRQCounter].Pin = (temp >> 8) & 0xf; 232 245 #ifdef ACPI 233 246 temp2 = temp3 = 0; … … 242 255 { 243 256 // Check APIC IRQ, if we have /SMP /APIC, must be set 244 if (temp 3)245 temp = (temp & (~0xff)) | (temp 3& 0xff);257 if (temp1) 258 temp = (temp & (~0xff)) | (temp1 & 0xff); 246 259 // Check PIC IRQ 247 else if (temp 1)248 temp = (temp & (~0xff)) | (temp 1& 0xff);260 else if (temp3) 261 temp = (temp & (~0xff)) | (temp3 & 0xff); 249 262 dprintf(("pci_query_device: IRQs ACPI PIC%d APIC%d", temp1, temp3)); 263 sISRHigh[SaveIRQCounter].LowIRQ = temp1; 264 sISRHigh[SaveIRQCounter].HighIRQ = temp3; 250 265 } 251 266 #endif /* ACPI */
Note:
See TracChangeset
for help on using the changeset viewer.