Changeset 832cbe7 in mainline for uspace/drv/block/pci-ide/main.c


Ignore:
Timestamp:
2025-02-05T12:30:20Z (7 days ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
accdf882
Parents:
0dab4850
git-author:
Jiri Svoboda <jiri@…> (2025-02-04 21:30:06)
git-committer:
Jiri Svoboda <jiri@…> (2025-02-05 12:30:20)
Message:

Add proper IDE PCI to ISA fallback mechanism.

To determine if legacy IDE I/O ports are free, isa-ide asks isa,
who asks pciintel. pciintel waits for bus enumeration to complete,
then waits for all functions except the one who is asking
(which is ISA bus) to stabilize. During attach pci-ide will claim
the legacy IDE ports. Thus, if at this point legacy IDE ports
are unclaimed, pciintel tells ISA they are free, which tells isa-ide,
which continues to attach. If they are not free, isa-ide will not
attach.

This works for all use cases, including system without PCI bus,
system with PCI bus, but no (or disabled) PCI IDE, system with PCI
IDE with unrecognized VID/PID (which we will handle in legacy ISA mode).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/block/pci-ide/main.c

    r0dab4850 r832cbe7  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2025 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    133133        pci_ide_ctrl_t *ctrl;
    134134        pci_ide_hwres_t res;
     135        async_sess_t *parent_sess;
    135136        errno_t rc;
    136137
     
    164165        if (rc != EOK) {
    165166                ddf_msg(LVL_ERROR, "Failed initializing ATA controller.");
     167                rc = EIO;
     168                goto error;
     169        }
     170
     171        parent_sess = ddf_dev_parent_sess_get(dev);
     172        if (parent_sess == NULL) {
     173                rc = ENOMEM;
     174                goto error;
     175        }
     176
     177        /* Claim legacy I/O range to prevent ISA IDE from attaching there. */
     178        rc = hw_res_claim_legacy_io(parent_sess, hwc_isa_ide);
     179        if (rc != EOK) {
     180                ddf_msg(LVL_ERROR, "Failed claiming legacy I/O range.");
    166181                rc = EIO;
    167182                goto error;
Note: See TracChangeset for help on using the changeset viewer.