Ignore:
Timestamp:
Jul 17, 2017, 4:31:51 AM (8 years ago)
Author:
David Azarewicz
Message:

Added MSI support.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/os2ahci/ahci.c

    r188 r190  
    661661  DPRINTF(1,"ahci_complete_init: completing initialization of adapter #%d\n", ad_no(ai));
    662662
    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
    676671      {
    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);
    678695        return(-1);
    679696      }
    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    }
    682701  }
    683702
     
    13961415 */
    13971416#pragma aux ahci_intr parm [eax]
    1398 int ahci_intr(u16 irq)
     1417int ahci_intr(u32 irq)
    13991418{
    14001419  u32 irq_stat;
     
    15701589
    15711590    vNext = pIorb->pNxtIORB;
     1591
    15721592    iorb_complete(vIorb, pIorb);
    15731593  }
     
    17681788  ai->ports[p].devs[d].dev_type  = UIB_TYPE_DISK;
    17691789  pDevName = ai->ports[p].devs[d].dev_name;
    1770   strncpy(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));
    17711791
    17721792  if (id_buf[ATA_ID_CONFIG] & 0x8000U)
     
    17971817  }
    17981818
    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,
    18011821          ai->ports[p].devs[d].removable,
    18021822          ai->ports[p].devs[d].dev_type,
     
    18191839  if (ai->ports[p].devs[d].removable)
    18201840  {
    1821     sprintf(dev_name, RM_CD_PREFIX "%s", p, d, pDevName);
     1841    snprintf(dev_name, sizeof(dev_name), RM_CD_PREFIX "%s", p, d, pDevName);
    18221842  }
    18231843  else
    18241844  {
    1825     sprintf(dev_name, RM_HD_PREFIX "%s", p, d, pDevName);
     1845    snprintf(dev_name, sizeof(dev_name), RM_HD_PREFIX "%s", p, d, pDevName);
    18261846  }
    18271847
Note: See TracChangeset for help on using the changeset viewer.