- Timestamp:
- Jul 17, 2017, 4:31:51 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/os2ahci/Makefile
r188 r190 12 12 # Define default build version if not specified in environment 13 13 BLD_MAJOR=2 14 BLD_MINOR=0 2# must be 2 digits14 BLD_MINOR=03 # must be 2 digits 15 15 BLD_REV=0 # not used at this time 16 16 -
trunk/src/os2ahci/ReadMe.txt
r186 r190 1 AHCI Driver for OS/2 v2.0 11 AHCI Driver for OS/2 v2.03 2 2 3 3 … … 357 357 DSKSP_GEN_GET_COUNTERS IOCTL request. 358 358 359 Known Issues and Limitations 360 ============================ 361 362 Hot swap is not supported. 363 359 364 360 365 Manual Installation … … 384 389 Change Log 385 390 ========== 391 392 v.2.03 15-Jul-2017 - David Azarewicz 393 Added MSI support. 394 395 v.2.02 07-Jun-2017 - David Azarewicz 396 Fixed interrupt handler issue for multiple adapters. 386 397 387 398 v.2.01 01-Oct-2016 - David Azarewicz -
trunk/src/os2ahci/ahci.c
r188 r190 661 661 DPRINTF(1,"ahci_complete_init: completing initialization of adapter #%d\n", ad_no(ai)); 662 662 663 /* register IRQ handlers; each IRQ level is registered only once */ 664 for (i = 0; i < irq_used_cnt; i++) 665 { 666 if (irq_used[i] == ai->irq) break; /* we already have this IRQ registered */ 667 } 668 if (i >= irq_used_cnt) 669 { 670 if (i >= MAX_IRQ_HANDLERS) return -1; /* no more handlers available */ 671 DPRINTF(2,"registering interrupt #%d\n", ai->irq); 672 if (Dev32Help_SetIRQ(ahci_intr, ai->irq, 1, ai->irq) != 0) 673 { 674 DPRINTF(0,"failed to register shared interrupt\n"); 675 if (Dev32Help_SetIRQ(ahci_intr, ai->irq, 0, ai->irq) != 0) 663 if (!ai->int_set) 664 { 665 /* register IRQ handler; each IRQ level is registered only once */ 666 p = 1; /* int count */ 667 if (!(ai->flags & AHCI_HFLAG_NO_MSI)) 668 { 669 if (PsdMsiAlloc(ai->bus_dev_func, &p, &ai->irq)) p = 1; /* shared flag */ 670 else 676 671 { 677 dprintf(0,"failed to register interrupt %d\n", ai->irq); 672 /* we have an msi interrupt */ 673 ai->irq_pin = 0; 674 p = 0; /* exclusive flag */ 675 } 676 } 677 for (i = 0; i < irq_used_cnt; i++) 678 { 679 if (irq_used[i] == ai->irq) break; /* we already have this IRQ registered */ 680 } 681 if (i >= irq_used_cnt) 682 { 683 if (i >= MAX_IRQ_HANDLERS) return -1; /* no more handlers available */ 684 DPRINTF(2,"registering interrupt #%d\n", ai->irq); 685 686 rc = Dev32Help_SetIRQ(ahci_intr, ai->irq, p, ai->irq); 687 if (rc && p) /* if failed and was shared */ 688 { 689 p = 0; /* try exclusive */ 690 rc = Dev32Help_SetIRQ(ahci_intr, ai->irq, p, ai->irq); 691 } 692 if (rc) 693 { 694 dprintf(0,"failed to register interrupt %d\n", ai->irq); 678 695 return(-1); 679 696 } 680 } 681 irq_used[irq_used_cnt++] = ai->irq; 697 irq_used[irq_used_cnt++] = ai->irq; 698 ai->int_set = 1; 699 RmUpdateAddIrq(rm_drvh, ai->rm_adh, ai->irq, ai->irq_pin, p?RS_IRQ_SHARED:RS_IRQ_EXCLUSIVE); 700 } 682 701 } 683 702 … … 1396 1415 */ 1397 1416 #pragma aux ahci_intr parm [eax] 1398 int ahci_intr(u 16irq)1417 int ahci_intr(u32 irq) 1399 1418 { 1400 1419 u32 irq_stat; … … 1570 1589 1571 1590 vNext = pIorb->pNxtIORB; 1591 1572 1592 iorb_complete(vIorb, pIorb); 1573 1593 } … … 1768 1788 ai->ports[p].devs[d].dev_type = UIB_TYPE_DISK; 1769 1789 pDevName = ai->ports[p].devs[d].dev_name; 1770 str ncpy(pDevName, ata_dev_name(id_buf), sizeof(ai->ports[0].devs[0].dev_name));1790 strlcpy(pDevName, ata_dev_name(id_buf), sizeof(ai->ports[0].devs[0].dev_name)); 1771 1791 1772 1792 if (id_buf[ATA_ID_CONFIG] & 0x8000U) … … 1797 1817 } 1798 1818 1799 DPRINTF(2,"found device %d.%d.%d: removable = %d, dev_type = %d, atapi = %d, "1800 "ncq_max = %d\n",ad_no(ai), p, d,1819 DPRINTF(2,"found device %d.%d.%d: removable=%d dev_type=%d atapi=%d ncq_max=%d\n", 1820 ad_no(ai), p, d, 1801 1821 ai->ports[p].devs[d].removable, 1802 1822 ai->ports[p].devs[d].dev_type, … … 1819 1839 if (ai->ports[p].devs[d].removable) 1820 1840 { 1821 s printf(dev_name, RM_CD_PREFIX "%s", p, d, pDevName);1841 snprintf(dev_name, sizeof(dev_name), RM_CD_PREFIX "%s", p, d, pDevName); 1822 1842 } 1823 1843 else 1824 1844 { 1825 s printf(dev_name, RM_HD_PREFIX "%s", p, d, pDevName);1845 snprintf(dev_name, sizeof(dev_name), RM_HD_PREFIX "%s", p, d, pDevName); 1826 1846 } 1827 1847 -
trunk/src/os2ahci/ata.c
r188 r190 885 885 886 886 io->BlocksXferred += add_workspace(pIorb)->blocks; 887 DPRINTF(7, "ata_read_pp(): blocks transferred = %d\n", io->BlocksXferred);887 DPRINTF(7,__func__": blocks transferred = %d\n", io->BlocksXferred); 888 888 889 889 if (io->BlocksXferred >= io->BlockCount) … … 1392 1392 if (Dev32Help_PhysToLin(phys_addr, l, (PVOID) &p)) 1393 1393 { 1394 panic( "sg_memcpy(): DevHelp_PhysToLin() failed");1394 panic(__func__": DevHelp_PhysToLin() failed"); 1395 1395 } 1396 1396 if (dir == SG_TO_BUF) -
trunk/src/os2ahci/os2ahci.c
r186 r190 1103 1103 1104 1104 pPtr->AdapterDevBus = AI_DEVBUS_ST506 | AI_DEVBUS_32BIT; 1105 s printf(pPtr->AdapterName, "AHCI_%d", dta);1105 snprintf(pPtr->AdapterName, sizeof(pPtr->AdapterName), "AHCI_%d", dta); 1106 1106 1107 1107 if (!ad_info->port_scan_done) … … 1162 1162 /* set adapter name and bus type to mimic a SCSI controller */ 1163 1163 pPtr->AdapterDevBus = AI_DEVBUS_SCSI_2 | AI_DEVBUS_16BIT; 1164 s printf(pPtr->AdapterName, "AHCI_SCSI_0");1164 snprintf(pPtr->AdapterName, sizeof(pPtr->AdapterName), "AHCI_SCSI_0"); 1165 1165 1166 1166 /* add all ATAPI units to be emulated by this virtual adaper */ -
trunk/src/os2ahci/os2ahci.h
r185 r190 280 280 unsigned busy : 1; /* if != 0, adapter is busy */ 281 281 unsigned hw_ports : 6; /* number of ports as reported by the hardware */ 282 unsigned int_set:1; /* interrupt has been set */ 282 283 283 284 u32 port_map; /* 08 bitmap of active ports */ … … 294 295 HRESOURCE rm_adh; /* 44 resource handle for adapter */ 295 296 HRESOURCE rm_bars[6]; /* 48 resource handle for MMIO and I/O BARs */ 296 HRESOURCE rm_irq; /* 60 resource handle for IRQ */297 297 298 298 u16 bus_dev_func; /* 64 PCI bus number PCI device and function number */ 299 u16 irq; /* 66 interrupt number */ 299 u8 irq; /* 66 interrupt number */ 300 u8 irq_pin; /* 67 irq pin */ 300 301 301 302 u32 mmio_phys; /* 68 physical address of MMIO region */ … … 424 425 extern int ahci_flush_cache(AD_INFO *ai, int p, int d); 425 426 426 extern int ahci_intr(u 16irq);427 extern int ahci_intr(u32 irq); 427 428 extern void ahci_port_intr(AD_INFO *ai, int p); 428 429 extern void ahci_error_intr(AD_INFO *ai, int p, u32 irq_stat); -
trunk/src/os2ahci/pci.c
r188 r190 513 513 rc_list->NumResource = 0; 514 514 515 /* Register IRQ with resource manager */516 ret = RmAddIrq(rm_drvh, &ad_info->rm_irq, irq, pin);517 if (ret)518 {519 if (ret == RMRC_RES_ALREADY_CLAIMED)520 {521 ciiprintf("Device already claimed.");522 }523 else524 {525 iprintf("%s: couldn't register IRQ %d (rc = %s)", drv_name, irq, rmerr(ret));526 }527 return;528 }529 rc_list->hResource[rc_list->NumResource++] = ad_info->rm_irq;530 531 515 /* Allocate all I/O and MMIO addresses offered by this device. In theory, 532 516 * we need only BAR #5, the AHCI MMIO BAR, but in order to prevent any … … 600 584 ad_info->bus_dev_func = BusDevFunc; 601 585 ad_info->irq = irq; 586 ad_info->irq_pin = pin; 602 587 603 588 ad_info->mmio = MapPhysToLin(ad_info->mmio_phys, ad_info->mmio_size); … … 612 597 613 598 memset(&adapter, 0x00, sizeof(adapter)); 614 s printf(tmp, "AHCI_%d Controller", ad_info_cnt);599 snprintf(tmp, sizeof(tmp), "AHCI_%d Controller", ad_info_cnt); 615 600 adapter.AdaptDescriptName = tmp; 616 601 adapter.AdaptFlags = 0; … … 650 635 return; 651 636 652 653 637 add_pci_fail: 654 638 /* something went wrong; try to clean up as far as possible */ … … 657 641 if (ad_info->rm_bars[i] != 0) RMDeallocResource(rm_drvh, ad_info->rm_bars[i]); 658 642 } 659 if (ad_info->rm_irq != 0) RMDeallocResource(rm_drvh, ad_info->rm_irq);660 643 } 661 644 -
trunk/tools/AddToFile.cmd
r179 r190 11 11 call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs' 12 12 call SysLoadFuncs 13 parse arg OutFile','String','Function','Parm1','Parm2','Parm3','Parm4 ;13 parse arg OutFile','String','Function','Parm1','Parm2','Parm3','Parm4','Parm5; 14 14 15 15 if (OutFile='') then do … … 33 33 rc=LineOut(MyFile, '--- AddToFile.cmd '||MyCmd); 34 34 call 'AddToFile.cmd' MyCmd; 35 MyCmd=MyFile||',option description,BLDLEVEL,Vendor,1.2.3,Description,Fixpack ';35 MyCmd=MyFile||',option description,BLDLEVEL,Vendor,1.2.3,Description,Fixpack,Asd'; 36 36 rc=LineOut(MyFile, '--- AddToFile.cmd '||MyCmd); 37 37 call 'AddToFile.cmd' MyCmd; … … 92 92 /* get fixpack from SVN version */ 93 93 if (Parm4='SVN') then Parm4='SVN'||SvnVersion(); 94 if (Parm2='DATE') then Parm2=SUBSTR(DATE('S'), 1, 4)||'.'||SUBSTR(DATE('S'), 5, 2)||'.'||SUBSTR(DATE('S'), 7, 2); 94 95 95 96 parse var Parm2 major'.'minor'.'ProjVersion; … … 100 101 end 101 102 102 NewStr='@#'||Parm1||':'||Parm2||'#@##1## '||ProjString||': :::'||ProjVersion||'::'||Parm4||'@@'||Parm3;103 NewStr='@#'||Parm1||':'||Parm2||'#@##1## '||ProjString||':'||Parm5||':::'||ProjVersion||'::'||Parm4||'@@'||Parm3; 103 104 if (Type='2') then do 104 105 /*OutStr=String||' "@#'||Parm1||':'||Parm2||'#@##1## '||ProjString||'::::'||ProjVersion||'::'||Parm4||'@@'||Parm3||'"';*/ … … 134 135 when (Function='DATEDAY') then do 135 136 NewStr=FORMAT(SUBSTR(DATE('S'), 7, 2)); 137 RepLoc=Pos('%A', String); 138 if (RepLoc>0) then OutStr=Substr(String,1,RepLoc-1)||NewStr||Substr(String,RepLoc+2); 139 else OutStr=String||' '||NewStr; 140 rc=lineout(OutFile, OutStr); 141 rc=lineout(OutFile); 142 end 143 144 when (Function='DATE1') then do 145 parse value Date('N') with MyDay MyMonth MyYear; 146 NewStr=MyYear||'-'||MyMonth||'-'||Right(MyDay, 2, 0); 136 147 RepLoc=Pos('%A', String); 137 148 if (RepLoc>0) then OutStr=Substr(String,1,RepLoc-1)||NewStr||Substr(String,RepLoc+2);
Note:
See TracChangeset
for help on using the changeset viewer.